diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..f6c26977bbb993b180afd759658dcf5ea6619cd0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,194 @@
+木兰宽松许可证,第2版
+
+木兰宽松许可证,第2版
+
+2020年1月 http://license.coscl.org.cn/MulanPSL2
+
+您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束:
+
+0. 定义
+
+“软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。
+
+“贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。
+
+“贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。
+
+“法人实体” 是指提交贡献的机构及其“关联实体”。
+
+“关联实体” 是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是
+指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。
+
+1. 授予版权许可
+
+每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可
+以复制、使用、修改、分发其“贡献”,不论修改与否。
+
+2. 授予专利许可
+
+每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定
+撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡
+献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软
+件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“
+关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或
+其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权
+行动之日终止。
+
+3. 无商标许可
+
+“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定
+的声明义务而必须使用除外。
+
+4. 分发限制
+
+您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“
+本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。
+
+5. 免责声明与责任限制
+
+“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对
+任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于
+何种法律理论,即使其曾被建议有此种损失的可能性。
+
+6. 语言
+
+“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文
+版为准。
+
+条款结束
+
+如何将木兰宽松许可证,第2版,应用到您的软件
+
+如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步:
+
+1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字;
+
+2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中;
+
+3, 请将如下声明文本放入每个源文件的头部注释中。
+
+Copyright (c) [Year] [name of copyright holder]
+[Software Name] is licensed under Mulan PSL v2.
+You can use this software according to the terms and conditions of the Mulan
+PSL v2.
+You may obtain a copy of Mulan PSL v2 at:
+ http://license.coscl.org.cn/MulanPSL2
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+See the Mulan PSL v2 for more details.
+
+Mulan Permissive Software License,Version 2
+
+Mulan Permissive Software License,Version 2 (Mulan PSL v2)
+
+January 2020 http://license.coscl.org.cn/MulanPSL2
+
+Your reproduction, use, modification and distribution of the Software shall
+be subject to Mulan PSL v2 (this License) with the following terms and
+conditions:
+
+0. Definition
+
+Software means the program and related documents which are licensed under
+this License and comprise all Contribution(s).
+
+Contribution means the copyrightable work licensed by a particular
+Contributor under this License.
+
+Contributor means the Individual or Legal Entity who licenses its
+copyrightable work under this License.
+
+Legal Entity means the entity making a Contribution and all its
+Affiliates.
+
+Affiliates means entities that control, are controlled by, or are under
+common control with the acting entity under this License, ‘control’ means
+direct or indirect ownership of at least fifty percent (50%) of the voting
+power, capital or other securities of controlled or commonly controlled
+entity.
+
+1. Grant of Copyright License
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to you a perpetual, worldwide, royalty-free, non-exclusive,
+irrevocable copyright license to reproduce, use, modify, or distribute its
+Contribution, with modification or not.
+
+2. Grant of Patent License
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to you a perpetual, worldwide, royalty-free, non-exclusive,
+irrevocable (except for revocation under this Section) patent license to
+make, have made, use, offer for sale, sell, import or otherwise transfer its
+Contribution, where such patent license is only limited to the patent claims
+owned or controlled by such Contributor now or in future which will be
+necessarily infringed by its Contribution alone, or by combination of the
+Contribution with the Software to which the Contribution was contributed.
+The patent license shall not apply to any modification of the Contribution,
+and any other combination which includes the Contribution. If you or your
+Affiliates directly or indirectly institute patent litigation (including a
+cross claim or counterclaim in a litigation) or other patent enforcement
+activities against any individual or entity by alleging that the Software or
+any Contribution in it infringes patents, then any patent license granted to
+you under this License for the Software shall terminate as of the date such
+litigation or activity is filed or taken.
+
+3. No Trademark License
+
+No trademark license is granted to use the trade names, trademarks, service
+marks, or product names of Contributor, except as required to fulfill notice
+requirements in section 4.
+
+4. Distribution Restriction
+
+You may distribute the Software in any medium with or without modification,
+whether in source or executable forms, provided that you provide recipients
+with a copy of this License and retain copyright, patent, trademark and
+disclaimer statements in the Software.
+
+5. Disclaimer of Warranty and Limitation of Liability
+
+THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY
+KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR
+COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT
+LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING
+FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO
+MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.
+
+6. Language
+
+THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION
+AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF
+DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION
+SHALL PREVAIL.
+
+END OF THE TERMS AND CONDITIONS
+
+How to Apply the Mulan Permissive Software License,Version 2
+(Mulan PSL v2) to Your Software
+
+To apply the Mulan PSL v2 to your work, for easy identification by
+recipients, you are suggested to complete following three steps:
+
+i. Fill in the blanks in following statement, including insert your software
+name, the year of the first publication of your software, and your name
+identified as the copyright owner;
+
+ii. Create a file named "LICENSE" which contains the whole context of this
+License in the first directory of your software package;
+
+iii. Attach the statement to the appropriate annotated syntax at the
+beginning of each source file.
+
+Copyright (c) [Year] [name of copyright holder]
+[Software Name] is licensed under Mulan PSL v2.
+You can use this software according to the terms and conditions of the Mulan
+PSL v2.
+You may obtain a copy of Mulan PSL v2 at:
+ http://license.coscl.org.cn/MulanPSL2
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+See the Mulan PSL v2 for more details.
diff --git a/hi-vision/Demo/create_live_channel.py b/hi-vision/Demo/create_live_channel.py
new file mode 100644
index 0000000000000000000000000000000000000000..a1a849d3571dfb9ddbdc07135c031d362aaa0c8f
--- /dev/null
+++ b/hi-vision/Demo/create_live_channel.py
@@ -0,0 +1,25 @@
+import os
+import oss2
+
+# access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '**')
+# access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '***')
+# bucket_name = os.getenv('OSS_TEST_BUCKET', '********')
+# endpoint = os.getenv('OSS_TEST_ENDPOINT', '***')
+
+# 创建Bucket实例。
+bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
+
+# 创建并配置流频道。
+# 频道的名称是test_rtmp_live。直播生成的m3u8文件叫做test.m3u8,该索引文件包含3片ts文件,每片ts文件的时长为5秒(这只是一个建议值,具体的时长取决于关键帧)。
+channel_name = "test_rtmp_live"
+playlist_name = "test.m3u8"
+
+create_result = bucket.create_live_channel(
+ channel_name,
+ oss2.models.LiveChannelInfo(
+ status = 'enabled',
+ description = '测试使用的直播频道',
+ target = oss2.models.LiveChannelInfoTarget(
+ playlist_name = playlist_name,
+ frag_count = 3,
+ frag_duration = 5)))
diff --git a/hi-vision/Demo/get_push_url.py b/hi-vision/Demo/get_push_url.py
new file mode 100644
index 0000000000000000000000000000000000000000..56244836769f50fd62aea95aa109afbdb4e65ee9
--- /dev/null
+++ b/hi-vision/Demo/get_push_url.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+import oss2
+from oss2.credentials import EnvironmentVariableCredentialsProvider
+
+# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
+auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
+# 填写Bucket所在地域对应的Endpoint。
+# 填写存储空间名称。
+bucket = oss2.Bucket(auth, 'https://oss-cn-nanjing.aliyuncs.com', 'redcap2')
+
+# 填写LiveChannel名称,例如test-channel。
+channel_name = "redcap_camera"
+playlist_name = "playlist.m3u8"
+
+channel = bucket.create_live_channel(
+ channel_name,
+ oss2.models.LiveChannelInfo(
+ status = 'enabled',
+ description = '测试使用的直播频道',
+ target = oss2.models.LiveChannelInfoTarget(
+ playlist_name = playlist_name,
+ frag_count = 3,
+ frag_duration = 4)))
+
+publish_url = channel.publish_url
+# 生成RTMP推流的签名URL,并设置过期时间为3600秒。
+signed_publish_url = bucket.sign_rtmp_url(channel_name, "playlist.m3u8", 3600)
+# 打印未签名推流地址。
+print('publish_url='+publish_url)
+# 打印签名推流地址。
+# print('signed_publish_url='+signed_publish_url)
diff --git a/hi-vision/Demo/redcap2.py b/hi-vision/Demo/redcap2.py
new file mode 100644
index 0000000000000000000000000000000000000000..8ec7cb5a44602c3818d3da95bfa6dfe04e1f8cdf
--- /dev/null
+++ b/hi-vision/Demo/redcap2.py
@@ -0,0 +1,50 @@
+import cv2
+import subprocess
+
+# HLS推流地址,这需要一个服务器或者本地文件系统的路径
+hls_out_path = 'rtmp://redcap2.oss-cn-nanjing.aliyuncs.com/live/redcap_camera'
+
+# 使用OpenCV捕获摄像头视频
+cap = cv2.VideoCapture(0) # 0表示默认摄像头
+
+# 定义FFmpeg命令,将视频转换为HLS格式
+ffmpeg_command = [
+ 'ffmpeg',
+ '-y', # 覆盖已有文件
+ '-f', 'rawvideo', # 输入格式为原始视频
+ '-pixel_format', 'bgr24', # 像素格式
+ '-video_size', '640x480', # 视频大小
+ '-i', '-', # 从标准输入读取
+ '-c:v', 'libx264', # 使用H.264编码
+ '-preset', 'veryfast', # 编码速度
+ '-hls_time', '2', # 每个片段的长度(秒)
+ '-hls_list_size', '3', # 播放列表中的最大片段数量
+ '-hls_flags', 'delete_segments+append_list', # 删除旧片段并持续更新播放列表
+ '-start_number', '1', # 起始片段序号
+ hls_out_path # HLS输出路径
+]
+
+# 启动FFmpeg进程
+process = subprocess.Popen(ffmpeg_command, stdin=subprocess.PIPE)
+
+while True:
+ # 从摄像头读取帧
+ ret, frame = cap.read()
+ if not ret:
+ break
+
+ # 将帧写入FFmpeg的标准输入
+ process.stdin.write(frame.tobytes())
+
+ # 显示捕获的视频(可选)
+ cv2.imshow("Camera Feed", frame)
+
+ # 按下'q'键退出
+ if cv2.waitKey(1) & 0xFF == ord('q'):
+ break
+
+# 释放资源
+cap.release()
+process.stdin.close()
+process.wait()
+cv2.destroyAllWindows()
diff --git a/hi-vision/Demo/redcap_rtmp.py b/hi-vision/Demo/redcap_rtmp.py
new file mode 100644
index 0000000000000000000000000000000000000000..9da371137240f3b91a3fcba7a45aaddaf1651e97
--- /dev/null
+++ b/hi-vision/Demo/redcap_rtmp.py
@@ -0,0 +1,90 @@
+import subprocess
+import os
+import psutil
+import time
+import cv2
+
+def get_system_params():
+ """获取CPU和内存使用情况"""
+ cpu_usage = psutil.cpu_percent(interval=1)
+ memory_info = psutil.virtual_memory()
+ memory_usage = memory_info.percent
+ return cpu_usage, memory_usage
+
+def optimize_ffmpeg_command(cpu_usage, memory_usage):
+ """根据系统参数优化FFmpeg命令"""
+ if cpu_usage > 80:
+ # 如果CPU使用率高,降低帧率
+ frame_rate = 15
+ scale = '640:480'
+ elif memory_usage > 80:
+ # 如果内存使用率高,减少视频分辨率
+ frame_rate = 20
+ scale = '320:240'
+ else:
+ frame_rate = 20
+ scale = '640:480'
+
+ command = [
+ 'ffmpeg',
+ '-f', 'rawvideo',
+ '-pixel_format', 'bgr24',
+ '-video_size', scale,
+ '-framerate', str(frame_rate),
+ '-i', '-', # 从标准输入读取
+ '-c:v', 'libx264',
+ '-preset', 'ultrafast',
+ '-tune', 'zerolatency',
+ '-f', 'flv',
+ 'rtmp://rtmp.dd33.net/live/9fb3c888b037?91F116049D064C38'
+ ]
+
+ return command
+
+def main():
+ cap = cv2.VideoCapture(0) # 打开默认摄像头
+ if not cap.isOpened():
+ print("无法打开摄像头")
+ return
+
+ while True:
+ cpu_usage, memory_usage = get_system_params()
+ print(f"CPU Usage: {cpu_usage}%, Memory Usage: {memory_usage}%")
+
+ command = optimize_ffmpeg_command(cpu_usage, memory_usage)
+
+ try:
+ # 启动FFmpeg进程
+ process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ while True:
+ ret, frame = cap.read()
+ if not ret:
+ print("无法读取摄像头帧")
+ break
+
+ # 将帧写入FFmpeg的标准输入
+ process.stdin.write(frame.tobytes())
+
+ # 显示捕获的视频(可选)
+ cv2.imshow("Camera Feed", frame)
+
+ # 检查退出条件
+ if cv2.waitKey(1) & 0xFF == ord('q'):
+ break
+
+ except Exception as e:
+ print(f"Error occurred: {e}")
+ finally:
+ # 释放资源
+ cap.release()
+ process.stdin.close()
+ process.wait()
+ cv2.destroyAllWindows()
+ print("释放资源并退出.")
+
+ # 每隔5秒检查一次系统参数
+ time.sleep(5)
+
+if __name__ == "__main__":
+ main()
diff --git a/hi-vision/Picture/1.png b/hi-vision/Picture/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..58f0a43f2456b465ec23c3936e3b8c0bb3f768b3
Binary files /dev/null and b/hi-vision/Picture/1.png differ
diff --git a/hi-vision/Picture/10.png b/hi-vision/Picture/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..891c9638ad91bc62d323707645f22c47ee01c375
Binary files /dev/null and b/hi-vision/Picture/10.png differ
diff --git a/hi-vision/Picture/11.png b/hi-vision/Picture/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1fe3ed3b545f7c574d36b2b9faff3806982c63a
Binary files /dev/null and b/hi-vision/Picture/11.png differ
diff --git a/hi-vision/Picture/12.png b/hi-vision/Picture/12.png
new file mode 100644
index 0000000000000000000000000000000000000000..71a7112c92a7ace6da1a1fd4e969ec760c707d05
Binary files /dev/null and b/hi-vision/Picture/12.png differ
diff --git a/hi-vision/Picture/13.png b/hi-vision/Picture/13.png
new file mode 100644
index 0000000000000000000000000000000000000000..5066046fe3a55b9d8d3c2dd6b0d719e8c7bd0c00
Binary files /dev/null and b/hi-vision/Picture/13.png differ
diff --git a/hi-vision/Picture/14.png b/hi-vision/Picture/14.png
new file mode 100644
index 0000000000000000000000000000000000000000..a87d8767c0624945ed555a609b6ace8a00611d23
Binary files /dev/null and b/hi-vision/Picture/14.png differ
diff --git a/hi-vision/Picture/2.1.png b/hi-vision/Picture/2.1.png
new file mode 100644
index 0000000000000000000000000000000000000000..27541cbb4d9dba3619acf75c2b055a6f66b2fbbb
Binary files /dev/null and b/hi-vision/Picture/2.1.png differ
diff --git a/hi-vision/Picture/2.2.png b/hi-vision/Picture/2.2.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1f263c717fe50873a27c33f762e3bddb5ba2b3a
Binary files /dev/null and b/hi-vision/Picture/2.2.png differ
diff --git a/hi-vision/Picture/2.png b/hi-vision/Picture/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a19b64d57c0fa032843a13cc4e5e176adb3efe4
Binary files /dev/null and b/hi-vision/Picture/2.png differ
diff --git a/hi-vision/Picture/3.png b/hi-vision/Picture/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..69dbe2d5d8768b10898ae8d59f213b682e1f4294
Binary files /dev/null and b/hi-vision/Picture/3.png differ
diff --git a/hi-vision/Picture/4.png b/hi-vision/Picture/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..5027f9d443212fce56b0c3a26a4bb0eab9a8cded
Binary files /dev/null and b/hi-vision/Picture/4.png differ
diff --git a/hi-vision/Picture/5.png b/hi-vision/Picture/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..189f34e715e1e61e3fc442281ec2aa17577a8e5f
Binary files /dev/null and b/hi-vision/Picture/5.png differ
diff --git a/hi-vision/Picture/6.png b/hi-vision/Picture/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..249f889efbadb2b50ca1858d6578f94cb28e2d0d
Binary files /dev/null and b/hi-vision/Picture/6.png differ
diff --git a/hi-vision/Picture/7.png b/hi-vision/Picture/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..50c00b9fbd8ca4ba694f564b597bc70ae9ee4b8f
Binary files /dev/null and b/hi-vision/Picture/7.png differ
diff --git a/hi-vision/Picture/8.png b/hi-vision/Picture/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3cc0f7b62588a82539241b9ddaf8398e853e31c
Binary files /dev/null and b/hi-vision/Picture/8.png differ
diff --git a/hi-vision/Picture/9.png b/hi-vision/Picture/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff12e245720172a1929e0f0c3130761d1f98e94e
Binary files /dev/null and b/hi-vision/Picture/9.png differ
diff --git a/hi-vision/README.md b/hi-vision/README.md
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..49bf6ac8776353813f40fceb620e654e8b71ed34 100644
--- a/hi-vision/README.md
+++ b/hi-vision/README.md
@@ -0,0 +1,231 @@
+
海鸥派和RedCap初始化
+1. 烧录镜像,详细操作步骤在/hi-vision/[openeuler_v1.1.1](https://gitee.com/xiongsonglin/yocto-embedded-tools/tree/hieuler/hi-vision/openeuler_v1.1.1)/Readme.md中
+
+2. 重新上电启动海鸥派,使用xshell连接串口,等待初始化后,即可看到OpenEuler的命令行,输入用户名root,密码(第一次使用需要设置密码),当看到用户名变成绿色时,表示已经成功进入系统
+
+
+
+3. 在鼎桥Redcap MT5710 模组反面插入5G sim卡,并将该模组插入海鸥派的USB中,上电后该模组会亮3s蓝色的灯,等待近10s启动后,串口会有如下打印
+
+
+
+
+
+4. 在命令行中输入 ifconfig -a ,即可看到新增名为usb1的网口
+
+
+
+**PS:若ifconfig -a 找不到usb1,可能是因为下载的镜像中没有redcap驱动,请使用/hi-vision/patch中的**`5.10.0-153.28.0.patch`**和**`readcap_vendor_id.patch`**打热补丁**
+
+5. 可在当前目录下创建编辑测试拨号脚本dial.sh
+
+```bash
+touch dial.sh
+vi dial.sh
+```
+
+ 具体内容如下,“udhcpc-i 网卡名称(对应修改)”:
+
+```bash
+#!/bin/bash
+echo -e "AT^NDISDUP=1,1\r\n" > /dev/ttyUSB1
+sleep 1
+udhcpc-i usb1
+```
+
+
+
+6. 修改文件执行权限并执行脚本dial.sh,命令行显示成功得到DNS
+
+```bash
+chmod 777 dial.sh
+./dial.sh
+```
+
+
+
+**PS: 若./dial.sh一直卡在udhcpc: broadcasting discover,尝试重新插拔redcap**
+
+7. route发现有两个默认网关,其中一个是与电脑连接的网口,将这个默认网关删掉
+
+```bash
+route
+route del default gw 192.168.10.1
+```
+
+
+
+8. 添加DNS服务器,编辑 `/etc/resolv.conf`文件如下:
+
+```bash
+nameserver 8.8.8.8
+nameserver 8.8.4.4
+```
+
+9. ping百度,发现能够正常上网,表示该usb网络已调试完成
+
+
+
+10. 接下来,为了能够让海鸥派与服务器协作,我们需要校准海鸥派的时间
+
+```bash
+# 同步时区
+cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
+# 校准具体时间,以实际时间为准
+date -s "2024-09-27 17:48:00"
+```
+
+至此,海鸥派和RedCap的初始化全部完成
+
+部署ubuntu环境
+在Windows中安装Ubuntu22.04系统,使用VMware软件,在此略过
+
+下载项目代码
+在Ubuntu中运行/hi_vision/download.sh脚本,安装需要的4个环境包
+
+```plain
+chmod 777 ./download.sh
+./download.sh
+```
+
+将项目中的5个文件夹拷贝到docker容器中
+
+1. opencv
+2. opencv_contrib
+3. pyserial
+4. psutil
+5. numpy
+
+我们电脑中的docker容器目录为:/home/robot/hieuler/build_3403/build/hieulerpi
+
+命令类似如下:
+
+```plain
+cp -rf opencv /home/robot/hieuler/build_3403/build/hieulerpi
+```
+
+下载安装SDK
+进入docker容器目录:
+
+```plain
+cd /home/robot/hieuler/build_3403/build/hieulerpi
+```
+
+下载SDK
+
+```plain
+wget https://mirrors.dotsrc.org/openeuler/openEuler-24.03-LTS/embedded_img/aarch64/hieulerpi1-ros/openeuler-glibc-x86_64-openeuler-image-aarch64-hieulerpi1-toolchain-24.03-LTS.sh
+```
+
+增加可执行权限
+
+```plain
+ls -l chmod +x openeuler-glibc-x86_64-openeuler-image-aarch64-hieulerpi1-toolchain-24.03-LTS.sh
+```
+
+执行下面命令,切换到openEuler交互环境,用户切换为openeuler:
+
+```plain
+oebuild bitbake
+```
+
+安装刚刚下载的SDK:
+
+```plain
+./openeuler-glibc-x86_64-openeuler-image-aarch64-hieulerpi1-toolchain-24.03-LTS.sh
+```
+
+使SDK生效
+
+```plain
+. /opt/openeuler/oecore-x86_64/environment-setup-aarch64-openeuler-linux
+```
+
+退出openEuler交互环境
+
+```plain
+exit
+```
+
+编译项目代码
+```plain
+进入docker容器目录:
+
+cd /home/robot/hieuler/build_3403/build/hieulerpi
+
+
+
+执行下面命令,切换到openEuler交互环境,用户切换为openeuler:
+
+oebuild bitbake
+
+执行下面命令,加载SDK(注意.后面的空格)
+
+. /opt/openeuler/oecore-x86_64/environment-setup-aarch64-openeuler-linux
+
+依次编译上面第二步拷贝过来的文件夹,例如编译hi_vision项目(禁止BUILD_TESTING):
+
+cd hi_vision
+colcon build --cmake-args -DBUILD_TESTING=False
+
+编译完成后,生成的可执行文件在install目录中
+
+退出openEuler交叉编译环境
+
+exit
+```
+
+下载
+使用VMware的共享文件夹或下载VMware tools实现将所有生成的可执行文件从Ubuntu系统中拷贝至Windows桌面。
+
+然后使用xftp软件,将所有的可执行文件拷贝进入OpenEuler系统。
+
+```plain
+在开发板的openEuler环境,进入install目录,修改setup.sh:
+
+cd vision_install
+vi setup.sh
+
+第十行为colcon的编译目录名,
+_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX=/home/openeuler/build/sd3403/eulercar/install
+.
+我们需要将install目录下的所有文件中,该目录名,替换为,开发板的工作目录名/root/install。类似如下
+
+_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX=/root/vision_install
+
+这里手动修改,点击i进入编辑模式,修改好后按Esc键退出编辑模式,然后输入:wq保存退出文件
+```
+
+推流
+1. 依照RTMP服务器制作.md搭建RTMP服务器,并将.py中的RTMP URL切换为自己搭建的服务器的URL
+2. 该项目的运行还需要ffmpeg库,因此需要在ffmpeg官网上下载ARM64架构的ffmpeg库,进入网页[https://johnvansickle.com/ffmpeg/](https://johnvansickle.com/ffmpeg/),找到ffmpeg-release-arm64-static.tar.xz,点击下载
+
+
+
+将ffmpeg-release-arm64-static.tar.xz移动至主目录解压缩,并和/Demo/redcap_rtmp.py在同一目录下
+
+3. 插入usb摄像头,能看到检测到video
+
+
+
+4. 以上配置全部正确后,运行以下命令开始推流
+
+```plain
+python redcap_rtmp.py
+```
+
+Windows端拉流
+1. windows端下载ffplay,进入网站[https://www.gyan.dev/ffmpeg/builds/](https://www.gyan.dev/ffmpeg/builds/),点击release版本下载
+
+
+
+下载后解压,进入bin目录,打开Windows Shell,并输入以下指令
+
+```plain
+./ffplay -fflags nobuffer rtmp://rtmp.dd33.net/live/80e07838e6ce?45CE2282FCC6454A(修改为自己的RTMP URL)
+```
+
+运行后测试视频帧率23fps,延迟在2秒以内。
+
+
+
diff --git "a/hi-vision/RTMP\346\234\215\345\212\241\345\231\250\345\210\266\344\275\234README.md" "b/hi-vision/RTMP\346\234\215\345\212\241\345\231\250\345\210\266\344\275\234README.md"
new file mode 100644
index 0000000000000000000000000000000000000000..d8f52ac125da4f412d9ce9acf56edd130c7996c2
--- /dev/null
+++ "b/hi-vision/RTMP\346\234\215\345\212\241\345\231\250\345\210\266\344\275\234README.md"
@@ -0,0 +1,127 @@
+我们使用RTMP服务器进行视频流的传输,协议流程如下:
+
+
+
+用RTMP协议的流媒体推流还需要经过以下几个步骤:
+
+```plain
+握手(RTMP连接都是以握手作为开始)
+建立连接 (建立客户端与服务器之间的“网络连接”)
+建立流 (建立客户端与服务器之间的“网络流”)
+推流&播放
+```
+
+gcc-c++ 编译环境
+```plain
+sudo apt-get install build-essential
+sudo apt-get install gcc
+sudo apt-get install g++
+```
+
+openssl插件
+```plain
+wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz
+tar -zxvf tar -zxvf openssl-1.1.1d.tar.gz
+cd openssl-1.1.1d
+sudo ./config --prefix=/home/env/openssl-1.1.1d #prefix指定安装目录(自定义)
+sudo make
+sudo make install
+```
+
+pcre插件
+```plain
+wget https://ftp.pcre.org/pub/pcre/pcre-8.35.tar.gz
+tar -zxvf pcre-8.35.tar.gz
+cd pcre-8.35
+sudo ./configure --prefix=/home/env/pcre-8.35 #prefix指定安装目录(自定义)
+sudo make
+sudo make install
+```
+
+zlib插件
+```plain
+wget https://zlib.net/zlib-1.2.8.tar.gz
+tar -zxvf zlib-1.2.8.tar.gz
+cd zlib-1.2.8
+sudo ./configure --prefix=/home/env/zlib-1.2.8 #prefix指定安装目录(自定义)
+sudo make
+sudo make install
+```
+
+nginx-rtmp-module 流
+```plain
+git clone https://github.com/arut/nginx-rtmp-module.git
+unzip nginx-rtmp-module-master.zip
+```
+
+安装nginx
+```plain
+#cd nginx-1.14.0/
+源码路径(非安装目录): --with--xxx=DIR DIR一定是源码路径(解压后的路径)
+add-module=DIR DIR是unzip解压rtmp的的路径
+#./configure --prefix=/usr/local/nginx-1.14.0 --with-openssl=/home/env/openssl-1.1.1d --with-pcre=/home/env/pcre-8.35 --with-zlib=/home/env/zlib-1.2.8 --add-module=/home/env/nginx-rtmp-module-master --with-http_ssl_module
+#sudo make
+#sudo make install
+```
+
+配置nginx
+```plain
+vi /usr/local/nginx-1.14.0/conf/nginx.conf
+```
+
+增加如下配置
+
+```plain
+rtmp {
+ server {
+ listen 1935; #监听的端口
+ chunk_size 4096;
+ application hls { #rtmp推流请求路径
+ live on;
+ hls on;
+ hls_path /你的流存放路径; #hls_path需要可读可写的权限。
+ hls_fragment 5s; #一个片段含5秒内容,也就是1给文件含有5秒的内容进行保存
+ }
+ }
+}
+```
+
+修改http中的server模块:
+
+```plain
+server {
+ listen 81;
+ server_name localhost;
+
+ #charset koi8-r;
+
+ #access_log logs/host.access.log main;
+
+ location / {
+ root /usr/share/nginx/html;
+ index index.html index.htm;
+ }
+
+ #error_page 404 /404.html;
+
+ # redirect server error pages to the static page /50x.html
+ #
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root html;
+ }
+```
+
+启动nginx
+
+```plain
+ ps-ef |grep nginx
+```
+
+使用obs推流
+打开OBS Studio进行推流
+
+
+
+去配置的 hls_path(刚刚nginx.conf里面配置的存放流文件的路径) 目录查看是否产生了文件,cd到对应的路径能够看到路径下产生了.ts和.m3u8文件。
+
diff --git a/hi-vision/download.sh b/hi-vision/download.sh
new file mode 100644
index 0000000000000000000000000000000000000000..efbdbd8a73609e4d0a8f8fce8e27f5980bfb733a
--- /dev/null
+++ b/hi-vision/download.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# ҪصĴַ
+REPOS=(
+ "https://github.com/opencv/opencv.git"
+ "https://github.com/opencv/opencv_contrib.git"
+ "https://github.com/pyserial/pyserial.git"
+ "https://github.com/giampaolo/psutil.git"
+ "https://github.com/numpy/numpy.git"
+)
+
+# ȡűĿ¼
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+
+# űĿ¼
+cd $SCRIPT_DIR
+
+# ο¡ÿ
+for REPO in "${REPOS[@]}"; do
+ git clone $REPO
+done
diff --git a/hi-vision/openeuler_v1.1.1/1.JPG b/hi-vision/openeuler_v1.1.1/1.JPG
new file mode 100644
index 0000000000000000000000000000000000000000..d81a74f5b5b838e7096284fb1117c810aae444e8
Binary files /dev/null and b/hi-vision/openeuler_v1.1.1/1.JPG differ
diff --git a/hi-vision/openeuler_v1.1.1/2.png b/hi-vision/openeuler_v1.1.1/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ca256037a8eae75788a80107974e4e7203029db
Binary files /dev/null and b/hi-vision/openeuler_v1.1.1/2.png differ
diff --git a/hi-vision/openeuler_v1.1.1/3.png b/hi-vision/openeuler_v1.1.1/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a6b6d104fefb34ac9a5ee3d20c745936a5428dd
Binary files /dev/null and b/hi-vision/openeuler_v1.1.1/3.png differ
diff --git a/hi-vision/openeuler_v1.1.1/Readme.md b/hi-vision/openeuler_v1.1.1/Readme.md
new file mode 100644
index 0000000000000000000000000000000000000000..ff57c8b15f738868c417725247ec54589ffd8e52
--- /dev/null
+++ b/hi-vision/openeuler_v1.1.1/Readme.md
@@ -0,0 +1,15 @@
+1. 为海鸥派上电,插入网口和串口(debug),并连接电脑,当海鸥派亮起红灯时表示正常启动
+
+
+
+2. 进入网址:https://gitee.com/HiEuler/doc/blob/master/EulerPi%20Compile%20using%20One%20Finger%20Zen.md,并按照教程下载ROS版本镜像文件和Uboot镜像
+
+
+
+3. 打开toolplatform软件
+4. 选择串口和网口,在烧写eMMC选项处加载eMMC分区表文件parttable.xml,看到下方文件加载正常
+
+
+
+5. 点击烧写,按欧拉派网口旁的RST按键一次,看到下方命令行出现*************,即表示一切正常,等待烧录完成即可。
+
diff --git a/hi-vision/patch/5.10.0-153.28.0.patch b/hi-vision/patch/5.10.0-153.28.0.patch
new file mode 100644
index 0000000000000000000000000000000000000000..0353a06ca187db209c914bdd9becdedff3cb1a07
--- /dev/null
+++ b/hi-vision/patch/5.10.0-153.28.0.patch
@@ -0,0 +1,68213 @@
+From cd8ca2fc8fbccb9afbab7b090e7595c2075cf09f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=E6=98=93=E5=B0=8F=E6=B5=B7?=
+ <14510022+e-xiaohai@user.noreply.gitee.com>
+Date: Thu, 5 Sep 2024 06:47:30 +0000
+Subject: [PATCH] add redcap
+
+---
+ arch/arm/Makefile | 5 +
+ arch/arm64/Kconfig.platforms | 71 +
+ arch/arm64/boot/dts/Makefile | 1 +
+ arch/arm64/boot/dts/vendor/Makefile | 2 +
+ arch/arm64/boot/dts/vendor/ss928v100-demo.dts | 415 ++
+ arch/arm64/boot/dts/vendor/ss928v100.dtsi | 1107 ++++
+ arch/arm64/configs/hieulerpi1_defconfig | 5630 +++++++++++++++++
+ arch/arm64/configs/ss928v100_defconfig | 3665 +++++++++++
+ arch/arm64/configs/ss928v100_emmc_defconfig | 4137 ++++++++++++
+ arch/arm64/configs/ss928v100_nand_defconfig | 3669 +++++++++++
+ arch/arm64/kernel/pci.c | 12 +
+ arch/arm64/mm/init.c | 4 +
+ drivers/Kconfig | 2 +
+ drivers/Makefile | 1 +
+ drivers/clk/Kconfig | 1 +
+ drivers/clk/Makefile | 1 +
+ drivers/clk/vendor/Kconfig | 12 +
+ drivers/clk/vendor/Makefile | 8 +
+ drivers/clk/vendor/clk.c | 288 +
+ drivers/clk/vendor/clk.h | 127 +
+ drivers/clk/vendor/clk_hi3519dv500.c | 507 ++
+ drivers/clk/vendor/clk_ss928v100.c | 693 ++
+ drivers/clk/vendor/clkgate_separated.c | 108 +
+ drivers/clk/vendor/crg.h | 24 +
+ drivers/clk/vendor/reset.c | 145 +
+ drivers/clk/vendor/reset.h | 29 +
+ drivers/dma/Makefile | 1 +
+ drivers/dma/edmacv310.c | 1450 +++++
+ drivers/dma/edmacv310.h | 147 +
+ drivers/gpio/gpio-pl061.c | 15 +
+ drivers/i2c/busses/Kconfig | 27 +
+ drivers/i2c/busses/Makefile | 1 +
+ drivers/i2c/busses/i2c-bsp.c | 1534 +++++
+ drivers/i2c/i2c-dev.c | 55 +
+ drivers/iio/adc/Kconfig | 10 +
+ drivers/iio/adc/Makefile | 1 +
+ drivers/iio/adc/bsp_lsadc.c | 473 ++
+ drivers/iio/industrialio-core.c | 48 +
+ drivers/iommu/Kconfig | 72 +-
+ drivers/iommu/Makefile | 5 +-
+ drivers/iommu/amd/amd_iommu.h | 1 -
+ drivers/iommu/amd/amd_iommu_types.h | 1 -
+ drivers/iommu/amd/init.c | 193 +-
+ drivers/iommu/amd/iommu.c | 13 +-
+ drivers/iommu/amd/iommu_v2.c | 7 +-
+ drivers/iommu/arm/arm-smmu-v3/Makefile | 1 -
+ .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 18 +-
+ drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 1785 ++----
+ drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 98 +-
+ drivers/iommu/arm/arm-smmu-v3/ascend_smmu.c | 434 --
+ drivers/iommu/arm/arm-smmu/arm-smmu.c | 47 +-
+ drivers/iommu/arm/arm-smmu/qcom_iommu.c | 7 +-
+ drivers/iommu/dma-iommu.c | 6 +-
+ drivers/iommu/exynos-iommu.c | 6 +-
+ drivers/iommu/fsl_pamu.c | 2 +-
+ drivers/iommu/intel/Kconfig | 1 -
+ drivers/iommu/intel/dmar.c | 86 +-
+ drivers/iommu/intel/iommu.c | 355 +-
+ drivers/iommu/intel/irq_remapping.c | 13 +-
+ drivers/iommu/intel/pasid.c | 32 +-
+ drivers/iommu/intel/pasid.h | 16 +-
+ drivers/iommu/intel/svm.c | 383 +-
+ drivers/iommu/io-pgfault.c | 6 +
+ drivers/iommu/io-pgtable-arm-v7s.c | 6 +-
+ drivers/iommu/io-pgtable-arm.c | 409 +-
+ drivers/iommu/ioasid.c | 38 +-
+ drivers/iommu/iommu-sva-lib.c | 39 +-
+ drivers/iommu/iommu-sva-lib.h | 7 +-
+ drivers/iommu/iommu.c | 321 +-
+ drivers/iommu/iova.c | 39 +-
+ drivers/iommu/ipmmu-vmsa.c | 4 +-
+ drivers/iommu/msm_iommu.c | 11 +-
+ drivers/iommu/mtk_iommu.c | 3 +-
+ drivers/iommu/mtk_iommu_v1.c | 26 +-
+ drivers/iommu/omap-iommu-debug.c | 6 +-
+ drivers/iommu/omap-iommu.c | 2 +-
+ drivers/iommu/sun50i-iommu.c | 16 +-
+ drivers/iommu/sw64/Kconfig | 9 -
+ drivers/iommu/sw64/Makefile | 2 -
+ drivers/iommu/sw64/sunway_iommu.c | 1693 -----
+ drivers/iommu/sw64/sunway_iommu.h | 77 -
+ drivers/iommu/virtio-iommu.c | 3 +-
+ drivers/media/usb/uvc/uvc_ctrl.c | 30 +-
+ drivers/media/usb/uvc/uvc_driver.c | 71 +-
+ drivers/media/usb/uvc/uvc_entity.c | 2 +-
+ drivers/media/usb/uvc/uvc_status.c | 40 +-
+ drivers/media/usb/uvc/uvc_video.c | 15 +-
+ drivers/media/usb/uvc/uvcvideo.h | 9 +-
+ drivers/mfd/Makefile | 1 +
+ drivers/mfd/bsp_fmc.c | 134 +
+ drivers/mmc/core/core.c | 37 +-
+ drivers/mmc/core/mmc.c | 7 +-
+ drivers/mmc/core/sd.c | 1 +
+ drivers/mmc/core/sdio.c | 46 +-
+ drivers/mmc/host/Kconfig | 7 +
+ drivers/mmc/host/Makefile | 2 +
+ drivers/mmc/host/bsp_quirk_ids.h | 67 +
+ drivers/mmc/host/cqhci.c | 58 +-
+ drivers/mmc/host/cqhci.h | 8 +
+ drivers/mmc/host/mci_proc.c | 338 +
+ drivers/mmc/host/mci_proc.h | 41 +
+ drivers/mmc/host/sdhci-bsp.c | 950 +++
+ drivers/mmc/host/sdhci-bsp.h | 135 +
+ drivers/mmc/host/sdhci-ss928v100.c | 931 +++
+ drivers/mmc/host/sdhci.c | 34 +-
+ drivers/mmc/host/sdhci.h | 30 +-
+ drivers/net/ethernet/Kconfig | 1 +
+ drivers/net/ethernet/Makefile | 1 +
+ drivers/net/ethernet/vendor/Kconfig | 20 +
+ drivers/net/ethernet/vendor/Makefile | 6 +
+ drivers/net/ethernet/vendor/gmac/Kconfig | 106 +
+ drivers/net/ethernet/vendor/gmac/Makefile | 2 +
+ .../ethernet/vendor/gmac/autoeee/autoeee.c | 137 +
+ .../ethernet/vendor/gmac/autoeee/autoeee.h | 49 +
+ .../vendor/gmac/autoeee/phy_id_table.c | 181 +
+ drivers/net/ethernet/vendor/gmac/gmac.c | 2289 +++++++
+ drivers/net/ethernet/vendor/gmac/gmac.h | 779 +++
+ .../ethernet/vendor/gmac/gmac_ethtool_ops.c | 401 ++
+ .../ethernet/vendor/gmac/gmac_ethtool_ops.h | 35 +
+ .../ethernet/vendor/gmac/gmac_netdev_ops.c | 730 +++
+ .../ethernet/vendor/gmac/gmac_netdev_ops.h | 22 +
+ .../net/ethernet/vendor/gmac/gmac_phy_fixup.c | 154 +
+ .../net/ethernet/vendor/gmac/gmac_phy_fixup.h | 13 +
+ drivers/net/ethernet/vendor/gmac/gmac_pm.c | 340 +
+ drivers/net/ethernet/vendor/gmac/gmac_pm.h | 56 +
+ drivers/net/ethernet/vendor/gmac/gmac_proc.c | 80 +
+ drivers/net/ethernet/vendor/gmac/gmac_proc.h | 21 +
+ drivers/net/phy/Kconfig | 6 +
+ drivers/net/phy/Makefile | 2 +
+ drivers/net/phy/mdio_bsp_gemac.c | 232 +
+ drivers/net/phy/mdio_bsp_gemac.h | 28 +
+ drivers/phy/Kconfig | 1 +
+ drivers/phy/Makefile | 1 +
+ drivers/phy/vendor/Kconfig | 23 +
+ drivers/phy/vendor/Makefile | 5 +
+ drivers/phy/vendor/phy-bsp-sata.c | 175 +
+ drivers/phy/vendor/phy-bsp-sata.h | 39 +
+ drivers/phy/vendor/phy-ss524v100-sata.c | 684 ++
+ drivers/phy/vendor/phy-ss528v100-sata.c | 1043 +++
+ drivers/phy/vendor/phy-ss625v100-sata.c | 732 +++
+ drivers/phy/vendor/usb/Kconfig | 88 +
+ drivers/phy/vendor/usb/Makefile | 21 +
+ drivers/phy/vendor/usb/phy-bsp-usb.c | 142 +
+ drivers/phy/vendor/usb/phy-bsp-usb.h | 66 +
+ drivers/phy/vendor/usb/phy-ss524v100-usb.c | 449 ++
+ drivers/phy/vendor/usb/phy-ss528v100-usb.c | 584 ++
+ drivers/phy/vendor/usb/phy-ss928v100-usb.c | 358 ++
+ drivers/phy/vendor/usb/phy-xvp-bsp-usb.c | 798 +++
+ drivers/pwm/Kconfig | 9 +
+ drivers/pwm/Makefile | 1 +
+ drivers/pwm/pwm-bsp.c | 434 ++
+ drivers/pwm/sysfs.c | 114 +-
+ drivers/spi/spi-pl022.c | 237 +-
+ drivers/usb/dwc3/Makefile | 4 +-
+ drivers/usb/dwc3/core.c | 51 +-
+ drivers/usb/dwc3/core.h | 47 +
+ drivers/usb/dwc3/dwc3-bsp.c | 441 ++
+ drivers/usb/dwc3/dwc3-bsp.h | 47 +
+ drivers/usb/dwc3/ep0.c | 46 +
+ drivers/usb/dwc3/gadget.c | 211 +-
+ drivers/usb/dwc3/proc.c | 132 +
+ drivers/usb/gadget/Kconfig | 8 +
+ drivers/usb/gadget/configfs.c | 4 +
+ drivers/usb/gadget/epautoconf.c | 18 +-
+ drivers/usb/gadget/function/f_mass_storage.c | 8 +-
+ drivers/usb/gadget/function/f_uac1.c | 58 +-
+ drivers/usb/gadget/function/f_uvc.c | 463 +-
+ drivers/usb/gadget/function/u_audio.c | 2 +-
+ drivers/usb/gadget/function/u_serial.c | 23 +-
+ drivers/usb/gadget/function/u_uvc.h | 5 +-
+ drivers/usb/gadget/function/uvc.h | 46 +-
+ drivers/usb/gadget/function/uvc_configfs.c | 857 ++-
+ drivers/usb/gadget/function/uvc_v4l2.c | 28 +-
+ drivers/usb/gadget/function/uvc_video.c | 490 +-
+ drivers/usb/gadget/udc/renesas_usb3.c | 1 -
+ drivers/usb/serial/option.c | 104 +
+ drivers/vendor/Kconfig | 5 +
+ drivers/vendor/Makefile | 3 +
+ drivers/vendor/cma/Kconfig | 16 +
+ drivers/vendor/cma/Makefile | 2 +
+ drivers/vendor/cma/cma.c | 176 +
+ drivers/vendor/npu/Kconfig | 7 +
+ drivers/vendor/npu/Makefile | 6 +
+ drivers/vendor/npu/npu_misc.c | 770 +++
+ drivers/vendor/npu/npu_svm.c | 1370 ++++
+ drivers/vendor/npu/smmu_power_on.c | 91 +
+ drivers/vendor/peri/Makefile | 2 +
+ drivers/vendor/peri/peri_io_ss928v100.c | 46 +
+ fs/read_write.c | 2 +
+ include/dt-bindings/clock/ss928v100_clock.h | 146 +
+ include/linux/bsp_cma.h | 52 +
+ include/linux/clk-provider.h | 1 +
+ include/linux/edmac.h | 80 +
+ include/linux/i2c.h | 17 +
+ include/linux/iio/iio.h | 7 +
+ include/linux/io-pgtable.h | 34 +-
+ include/linux/ioasid.h | 21 +-
+ include/linux/iommu.h | 128 +-
+ include/linux/iova.h | 5 +-
+ include/linux/iprec.h | 51 +
+ include/linux/mfd/bsp_fmc.h | 480 ++
+ include/linux/mm_types.h | 3 +
+ include/linux/mmc/host.h | 14 +-
+ include/linux/pwm.h | 4 +
+ include/linux/securec.h | 629 ++
+ include/linux/securectype.h | 585 ++
+ include/linux/vendor/peri_io.h | 57 +
+ include/linux/vendor/sva_ext.h | 93 +
+ include/uapi/linux/i2c-dev.h | 2 +
+ include/uapi/linux/i2c.h | 3 +
+ include/uapi/linux/usb/g_uvc.h | 15 +
+ include/uapi/linux/usb/video.h | 90 +
+ include/uapi/linux/videodev2.h | 1 +
+ kernel/Makefile | 2 +
+ kernel/dma/contiguous.c | 16 +
+ kernel/fork.c | 8 +
+ kernel/iprec.c | 410 ++
+ kernel/kallsyms.c | 1 +
+ kernel/sched/core.c | 1 +
+ lib/Kconfig | 4 +
+ lib/Makefile | 2 +
+ lib/securec/LICENSE | 124 +
+ lib/securec/Makefile | 1 +
+ lib/securec/README.en.md | 59 +
+ lib/securec/README.md | 56 +
+ lib/securec/src/Makefile | 17 +
+ lib/securec/src/input.inl | 2229 +++++++
+ lib/securec/src/memcpy_s.c | 555 ++
+ lib/securec/src/memmove_s.c | 123 +
+ lib/securec/src/memset_s.c | 510 ++
+ lib/securec/src/output.inl | 1720 +++++
+ lib/securec/src/scanf_s.c | 51 +
+ lib/securec/src/secinput.h | 181 +
+ lib/securec/src/securecutil.c | 81 +
+ lib/securec/src/securecutil.h | 574 ++
+ lib/securec/src/secureinput_a.c | 38 +
+ lib/securec/src/secureprintoutput.h | 146 +
+ lib/securec/src/secureprintoutput_a.c | 112 +
+ lib/securec/src/snprintf_s.c | 110 +
+ lib/securec/src/sprintf_s.c | 58 +
+ lib/securec/src/sscanf_s.c | 58 +
+ lib/securec/src/strcat_s.c | 101 +
+ lib/securec/src/strcpy_s.c | 353 ++
+ lib/securec/src/strncat_s.c | 119 +
+ lib/securec/src/strncpy_s.c | 145 +
+ lib/securec/src/strtok_s.c | 116 +
+ lib/securec/src/vscanf_s.c | 63 +
+ lib/securec/src/vsnprintf_s.c | 138 +
+ lib/securec/src/vsprintf_s.c | 67 +
+ lib/securec/src/vsscanf_s.c | 87 +
+ 250 files changed, 56505 insertions(+), 5453 deletions(-)
+ create mode 100644 arch/arm64/boot/dts/vendor/Makefile
+ create mode 100644 arch/arm64/boot/dts/vendor/ss928v100-demo.dts
+ create mode 100644 arch/arm64/boot/dts/vendor/ss928v100.dtsi
+ create mode 100644 arch/arm64/configs/hieulerpi1_defconfig
+ create mode 100644 arch/arm64/configs/ss928v100_defconfig
+ create mode 100644 arch/arm64/configs/ss928v100_emmc_defconfig
+ create mode 100644 arch/arm64/configs/ss928v100_nand_defconfig
+ create mode 100644 drivers/clk/vendor/Kconfig
+ create mode 100644 drivers/clk/vendor/Makefile
+ create mode 100644 drivers/clk/vendor/clk.c
+ create mode 100644 drivers/clk/vendor/clk.h
+ create mode 100644 drivers/clk/vendor/clk_hi3519dv500.c
+ create mode 100644 drivers/clk/vendor/clk_ss928v100.c
+ create mode 100644 drivers/clk/vendor/clkgate_separated.c
+ create mode 100644 drivers/clk/vendor/crg.h
+ create mode 100644 drivers/clk/vendor/reset.c
+ create mode 100644 drivers/clk/vendor/reset.h
+ create mode 100644 drivers/dma/edmacv310.c
+ create mode 100644 drivers/dma/edmacv310.h
+ create mode 100644 drivers/i2c/busses/i2c-bsp.c
+ create mode 100644 drivers/iio/adc/bsp_lsadc.c
+ delete mode 100644 drivers/iommu/arm/arm-smmu-v3/ascend_smmu.c
+ delete mode 100644 drivers/iommu/sw64/Kconfig
+ delete mode 100644 drivers/iommu/sw64/Makefile
+ delete mode 100644 drivers/iommu/sw64/sunway_iommu.c
+ delete mode 100644 drivers/iommu/sw64/sunway_iommu.h
+ create mode 100644 drivers/mfd/bsp_fmc.c
+ create mode 100644 drivers/mmc/host/bsp_quirk_ids.h
+ create mode 100644 drivers/mmc/host/mci_proc.c
+ create mode 100644 drivers/mmc/host/mci_proc.h
+ create mode 100644 drivers/mmc/host/sdhci-bsp.c
+ create mode 100644 drivers/mmc/host/sdhci-bsp.h
+ create mode 100644 drivers/mmc/host/sdhci-ss928v100.c
+ create mode 100644 drivers/net/ethernet/vendor/Kconfig
+ create mode 100644 drivers/net/ethernet/vendor/Makefile
+ create mode 100644 drivers/net/ethernet/vendor/gmac/Kconfig
+ create mode 100644 drivers/net/ethernet/vendor/gmac/Makefile
+ create mode 100644 drivers/net/ethernet/vendor/gmac/autoeee/autoeee.c
+ create mode 100644 drivers/net/ethernet/vendor/gmac/autoeee/autoeee.h
+ create mode 100644 drivers/net/ethernet/vendor/gmac/autoeee/phy_id_table.c
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac.c
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac.h
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac_ethtool_ops.c
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac_ethtool_ops.h
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac_netdev_ops.c
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac_netdev_ops.h
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac_phy_fixup.c
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac_phy_fixup.h
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac_pm.c
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac_pm.h
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac_proc.c
+ create mode 100644 drivers/net/ethernet/vendor/gmac/gmac_proc.h
+ create mode 100644 drivers/net/phy/mdio_bsp_gemac.c
+ create mode 100644 drivers/net/phy/mdio_bsp_gemac.h
+ create mode 100644 drivers/phy/vendor/Kconfig
+ create mode 100644 drivers/phy/vendor/Makefile
+ create mode 100644 drivers/phy/vendor/phy-bsp-sata.c
+ create mode 100644 drivers/phy/vendor/phy-bsp-sata.h
+ create mode 100644 drivers/phy/vendor/phy-ss524v100-sata.c
+ create mode 100644 drivers/phy/vendor/phy-ss528v100-sata.c
+ create mode 100644 drivers/phy/vendor/phy-ss625v100-sata.c
+ create mode 100644 drivers/phy/vendor/usb/Kconfig
+ create mode 100644 drivers/phy/vendor/usb/Makefile
+ create mode 100644 drivers/phy/vendor/usb/phy-bsp-usb.c
+ create mode 100644 drivers/phy/vendor/usb/phy-bsp-usb.h
+ create mode 100644 drivers/phy/vendor/usb/phy-ss524v100-usb.c
+ create mode 100644 drivers/phy/vendor/usb/phy-ss528v100-usb.c
+ create mode 100644 drivers/phy/vendor/usb/phy-ss928v100-usb.c
+ create mode 100644 drivers/phy/vendor/usb/phy-xvp-bsp-usb.c
+ create mode 100644 drivers/pwm/pwm-bsp.c
+ create mode 100644 drivers/usb/dwc3/dwc3-bsp.c
+ create mode 100644 drivers/usb/dwc3/dwc3-bsp.h
+ create mode 100644 drivers/usb/dwc3/proc.c
+ create mode 100644 drivers/vendor/Kconfig
+ create mode 100644 drivers/vendor/Makefile
+ create mode 100644 drivers/vendor/cma/Kconfig
+ create mode 100644 drivers/vendor/cma/Makefile
+ create mode 100644 drivers/vendor/cma/cma.c
+ create mode 100644 drivers/vendor/npu/Kconfig
+ create mode 100644 drivers/vendor/npu/Makefile
+ create mode 100644 drivers/vendor/npu/npu_misc.c
+ create mode 100644 drivers/vendor/npu/npu_svm.c
+ create mode 100644 drivers/vendor/npu/smmu_power_on.c
+ create mode 100644 drivers/vendor/peri/Makefile
+ create mode 100644 drivers/vendor/peri/peri_io_ss928v100.c
+ create mode 100644 include/dt-bindings/clock/ss928v100_clock.h
+ create mode 100644 include/linux/bsp_cma.h
+ create mode 100644 include/linux/edmac.h
+ create mode 100755 include/linux/iprec.h
+ create mode 100644 include/linux/mfd/bsp_fmc.h
+ create mode 100644 include/linux/securec.h
+ create mode 100644 include/linux/securectype.h
+ create mode 100644 include/linux/vendor/peri_io.h
+ create mode 100644 include/linux/vendor/sva_ext.h
+ create mode 100755 kernel/iprec.c
+ create mode 100644 lib/securec/LICENSE
+ create mode 100644 lib/securec/Makefile
+ create mode 100644 lib/securec/README.en.md
+ create mode 100644 lib/securec/README.md
+ create mode 100644 lib/securec/src/Makefile
+ create mode 100644 lib/securec/src/input.inl
+ create mode 100644 lib/securec/src/memcpy_s.c
+ create mode 100644 lib/securec/src/memmove_s.c
+ create mode 100644 lib/securec/src/memset_s.c
+ create mode 100644 lib/securec/src/output.inl
+ create mode 100644 lib/securec/src/scanf_s.c
+ create mode 100644 lib/securec/src/secinput.h
+ create mode 100644 lib/securec/src/securecutil.c
+ create mode 100644 lib/securec/src/securecutil.h
+ create mode 100644 lib/securec/src/secureinput_a.c
+ create mode 100644 lib/securec/src/secureprintoutput.h
+ create mode 100644 lib/securec/src/secureprintoutput_a.c
+ create mode 100644 lib/securec/src/snprintf_s.c
+ create mode 100644 lib/securec/src/sprintf_s.c
+ create mode 100644 lib/securec/src/sscanf_s.c
+ create mode 100644 lib/securec/src/strcat_s.c
+ create mode 100644 lib/securec/src/strcpy_s.c
+ create mode 100644 lib/securec/src/strncat_s.c
+ create mode 100644 lib/securec/src/strncpy_s.c
+ create mode 100644 lib/securec/src/strtok_s.c
+ create mode 100644 lib/securec/src/vscanf_s.c
+ create mode 100644 lib/securec/src/vsnprintf_s.c
+ create mode 100644 lib/securec/src/vsprintf_s.c
+ create mode 100644 lib/securec/src/vsscanf_s.c
+
+diff --git a/arch/arm/Makefile b/arch/arm/Makefile
+index d6817de42f24..07acfc5380cb 100644
+--- a/arch/arm/Makefile
++++ b/arch/arm/Makefile
+@@ -183,6 +183,7 @@ machine-$(CONFIG_ARCH_FOOTBRIDGE) += footbridge
+ machine-$(CONFIG_ARCH_GEMINI) += gemini
+ machine-$(CONFIG_ARCH_HIGHBANK) += highbank
+ machine-$(CONFIG_ARCH_HISI) += hisi
++machine-$(CONFIG_ARCH_BSP) += bsp
+ machine-$(CONFIG_ARCH_INTEGRATOR) += integrator
+ machine-$(CONFIG_ARCH_IOP32X) += iop32x
+ machine-$(CONFIG_ARCH_IXP4XX) += ixp4xx
+@@ -271,6 +272,10 @@ KBUILD_CPPFLAGS += $(patsubst %,-I$(srctree)/%include,$(machdirs) $(platdirs))
+ endif
+ endif
+
++ifeq ($(CONFIG_ARCH_BSP),y)
++KBUILD_CPPFLAGS += $(patsubst %,-I%include,$(machdirs) $(platdirs))
++endif
++
+ export TEXT_OFFSET GZFLAGS MMUEXT
+
+ core-y += arch/arm/
+diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms
+index c924fce750f1..63cb3695098e 100644
+--- a/arch/arm64/Kconfig.platforms
++++ b/arch/arm64/Kconfig.platforms
+@@ -136,6 +136,77 @@ config ARCH_HISI
+ help
+ This enables support for Hisilicon ARMv8 SoC family
+
++config ARCH_BSP
++ bool "Vendor SoC Family"
++ select ARM_TIMER_SP804
++ select PINCTRL
++ help
++ This enables support for Vendor ARMv8 SoC family
++
++config ARCH_SS528V100
++ bool "SS528V100 family"
++ depends on ARCH_BSP
++ select ARM_TIMER_SP804
++ select PINCTRL
++ help
++ Support for SS528V100 Soc family
++
++
++config ARCH_SS625V100
++ bool "SS625V100 family"
++ depends on ARCH_BSP
++ select ARM_TIMER_SP804
++ select PINCTRL
++ help
++ Support for SS625V100 Soc family
++
++config ARCH_SS919V100
++ bool "SS919V100 family"
++ depends on ARCH_BSP
++ select ARM_TIMER_SP804
++ select PINCTRL
++ help
++ Support for SS919V100 Soc family
++
++config ARCH_SS015V100
++ bool "SS015V100 family"
++ depends on ARCH_BSP
++ select ARM_TIMER_SP804
++ select PINCTRL
++ help
++ Support for SS015V100 Soc family
++
++config ARCH_SS928V100
++ bool "Vendor ss928v100 family"
++ depends on ARCH_BSP
++ select ARM_TIMER_SP804
++ select HISILICON_IRQ_MBIGEN if PCI
++ select PINCTRL
++ help
++ Support for Vendor SS928V100 Soc family
++
++config ARCH_SS927V100
++ bool "Vendor ss927v100 family"
++ depends on ARCH_BSP
++ select ARM_TIMER_SP804
++ select HISILICON_IRQ_MBIGEN if PCI
++ select PINCTRL
++ help
++ Support for Vendor SS927V100 Soc family
++
++config ACCESS_M7_DEV
++ bool "Enable to access the devices of m7"
++ depends on (ARCH_SS919V100 || ARCH_SS015V100)
++ help
++ supprot to access the devices of M7
++
++config ARCH_BSP_AMP
++ bool "Vendor AMP solution"
++ select DMA_SHARED_BUFFER
++ depends on (ARCH_SS919V100 || ARCH_SS015V100)
++ help
++ Support for SS919V100 and SS015V100 AMP
++
+ config ARCH_KEEMBAY
+ bool "Keem Bay SoC"
+ help
+diff --git a/arch/arm64/boot/dts/Makefile b/arch/arm64/boot/dts/Makefile
+index 9b1170658d60..33a2db38af67 100644
+--- a/arch/arm64/boot/dts/Makefile
++++ b/arch/arm64/boot/dts/Makefile
+@@ -30,3 +30,4 @@ subdir-y += ti
+ subdir-y += toshiba
+ subdir-y += xilinx
+ subdir-y += zte
++subdir-y += vendor
+diff --git a/arch/arm64/boot/dts/vendor/Makefile b/arch/arm64/boot/dts/vendor/Makefile
+new file mode 100644
+index 000000000000..bf71c96d6346
+--- /dev/null
++++ b/arch/arm64/boot/dts/vendor/Makefile
+@@ -0,0 +1,2 @@
++# SPDX-License-Identifier: GPL-2.0
++dtb-$(CONFIG_ARCH_BSP) += ss928v100-demo.dtb
+diff --git a/arch/arm64/boot/dts/vendor/ss928v100-demo.dts b/arch/arm64/boot/dts/vendor/ss928v100-demo.dts
+new file mode 100644
+index 000000000000..9ebd9255895c
+--- /dev/null
++++ b/arch/arm64/boot/dts/vendor/ss928v100-demo.dts
+@@ -0,0 +1,415 @@
++/* Copyright (c) 2017 Shenshu Technologies Co., Ltd.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program. If not, see .
++ *
++ */
++
++/dts-v1/;
++/* reserved for warmreset */
++/* reserved for arm trustedfirmware */
++/* Modify this configuration according to the system framework */
++/memreserve/ 0x0000000052fff000 0x0000000001a02000;
++#include "ss928v100.dtsi"
++
++/ {
++ model = "Vendor SS928V100 DEMO Board";
++ compatible = "vendor,ss928v100";
++
++ aliases {
++ serial0 = &uart0;
++
++ serial1 = &uart1;
++ serial2 = &uart2;
++ serial3 = &uart3;
++ serial4 = &uart4;
++ serial5 = &uart5;
++
++ i2c0 = &i2c_bus0;
++ i2c1 = &i2c_bus1;
++ i2c2 = &i2c_bus2;
++ i2c3 = &i2c_bus3;
++ i2c4 = &i2c_bus4;
++ i2c5 = &i2c_bus5;
++
++ spi0 = &spi_bus0;
++ spi1 = &spi_bus1;
++ spi2 = &spi_bus2;
++ spi3 = &spi_bus3;
++
++ gpio0 = &gpio_chip0;
++ gpio1 = &gpio_chip1;
++ gpio2 = &gpio_chip2;
++ gpio3 = &gpio_chip3;
++ gpio4 = &gpio_chip4;
++ gpio5 = &gpio_chip5;
++ gpio6 = &gpio_chip6;
++ gpio7 = &gpio_chip7;
++ gpio8 = &gpio_chip8;
++ gpio9 = &gpio_chip9;
++ gpio10 = &gpio_chip10;
++ gpio11 = &gpio_chip11;
++ gpio12 = &gpio_chip12;
++ gpio13 = &gpio_chip13;
++ gpio14 = &gpio_chip14;
++ gpio15 = &gpio_chip15;
++ gpio16 = &gpio_chip16;
++ gpio17 = &gpio_chip17;
++ };
++ hi110x {
++ compatible = "hisilicon,hi110x";
++ hi110x,subchip_type="hi1102a";
++ hi110x,gpio_power_on = <&gpio_chip2 2 0>;
++ hi110x,gpio_bfgx_power_on = <&gpio_chip2 0 0>;
++ hi110x,gpio_wlan_power_on = <&gpio_chip1 7 0>;
++ huawei,pmu_clk32b = "clk_pmu32kb";
++ hi110x,asic_version;
++ };
++
++ hisi_wifi {
++ compatible = "hisilicon,hisi_wifi";
++ hi110x,gpio_wlan_wakeup_host = <&gpio_chip2 1 0>;
++ hi110x,gpio_host_wakeup_wlan = <&gpio_chip8 6 0>;
++
++ hisi_wifi_firmware {
++ compatible = "hisi,wifi_firmware";
++ firmware_type_num="1";
++ };
++ };
++
++ hisi_bfgx {
++ compatible = "hisilicon,hisi_bfgx";
++ hi110x,gpio_bfgx_wakeup_host = <&gpio_chip9 6 0>;
++ hi110x,uart_port = "/dev/ttyAMA5";
++ };
++
++ hisi_cust_cfg {
++ compatible = "hi110x,customize";
++ ini_file_name = "/vendor/etc/cfg_hi1102a.ini";
++ };
++
++ chosen {
++ bootargs = "yt8521_phy_fix=enable earlycon=pl011,0x11040000 mem=512M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mtdblock2 rootfstype=yaffs2 rw mtdparts=bspnand:1M(boot),9M(kernel),32M(rootfs),1M(this_bootargs_string_is_reserved_for_bootargs_form_uboot!!!_it_must_be_longer_than_bootargs_form_uboot!!!_this_bootargs_string_is_reserved_for_bootargs_form_uboot!!!_it_must_be_longer_than_bootargs_form_uboot!!!_this_bootargs_string_is_reserved_for_bootargs_form_uboot!!!_it_must_be_longer_than_bootargs_form_uboot!!!_this_bootargs_string_is_reserved_for_bootargs_form_uboot!!!_it_must_be_longer_than_bootargs_form_uboot!!!_this_bootargs_string_is_reserved_for_bootargs_form_uboot!!!_it_must_be_longer_than_bootargs_form_uboot!!!)";
++
++ linux,initrd-start = <0x60000040>;
++ linux,initrd-end = <0x61000000>;
++ };
++ clocks {
++ clk20m: clk20m {
++ compatible = "fixed-clock";
++ #clock-cells = <0>;
++ clock-frequency = <20000000>;
++ clock-output-names = "clk20m";
++ };
++ };
++ cpus {
++ #address-cells = <2>;
++ #size-cells = <0>;
++
++ cpu@0 {
++ compatible = "arm,cortex-a55";
++ device_type = "cpu";
++ reg = <0x0 0x0>;
++ enable-method = "psci";
++ //clock-latency = <100000>; /* From legacy driver */
++ };
++
++ cpu@1 {
++ compatible = "arm,cortex-a55";
++ device_type = "cpu";
++ reg = <0x0 0x100>;
++ enable-method = "psci";
++ //clock-latency = <200000>; /* From legacy driver */
++ };
++
++ cpu@2 {
++ compatible = "arm,cortex-a55";
++ device_type = "cpu";
++ reg = <0x0 0x200>;
++ enable-method = "psci";
++ };
++
++ cpu@3 {
++ compatible = "arm,cortex-a55";
++ device_type = "cpu";
++ reg = <0x0 0x300>;
++ enable-method = "psci";
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0x0 0x50000000 0x1 0xf0000000>; /* system memory base */
++ };
++};
++
++&ipcm {
++ status = "okay";
++};
++
++&uart0 {
++ status = "okay";
++};
++
++&uart1 {
++ status = "okay";
++};
++
++&uart2 {
++ status = "okay";
++};
++
++&uart3 {
++ status = "okay";
++};
++
++&uart4 {
++ status = "okay";
++};
++&uart5 {
++ status = "okay";
++};
++
++&i2c_bus0 {
++ status = "okay";
++};
++
++&i2c_bus1 {
++ status = "okay";
++};
++
++&i2c_bus2 {
++ status = "okay";
++};
++
++&i2c_bus3 {
++ status = "okay";
++};
++
++&i2c_bus4 {
++ status = "okay";
++};
++
++&i2c_bus5 {
++ status = "okay";
++};
++
++&spi_bus0{
++ status = "okay";
++ /*
++ spidev@0 {
++ compatible = "rohm,dh2228fv";
++ reg = <0>;
++ pl022,interface = <0>;
++ pl022,com-mode = <0>;
++ spi-max-frequency = <25000000>;
++ };
++ */
++ can0: can@0 {
++ compatible = "microchip,mcp2515";
++ reg = <0>;
++ clocks = <&clk20m>;
++ spi-max-frequency = <10000000>;
++ interrupt-parent = <&gpio_chip1>;
++ interrupts = <6 IRQ_TYPE_EDGE_FALLING>;
++ status = "okay";
++ };
++};
++
++&spi_bus1{
++ status = "okay";
++ spidev@0 {
++ compatible = "rohm,dh2228fv";
++ reg = <0>;
++ pl022,interface = <0>;
++ pl022,com-mode = <0>;
++ spi-max-frequency = <25000000>;
++ };
++ spidev@1 {
++ compatible = "rohm,dh2228fv";
++ reg = <1>;
++ pl022,interface = <0>;
++ pl022,com-mode = <0>;
++ spi-max-frequency = <25000000>;
++ };
++};
++
++&spi_bus2{
++ status = "okay";
++ spidev@0 {
++ compatible = "rohm,dh2228fv";
++ reg = <0>;
++ pl022,interface = <0>;
++ pl022,com-mode = <0>;
++ spi-max-frequency = <25000000>;
++ };
++};
++
++&spi_bus3{
++ status = "okay";
++
++ spidev@0 {
++ compatible = "rohm,dh2228fv";
++ reg = <0>;
++ pl022,interface = <0>;
++ pl022,com-mode = <0>;
++ spi-max-frequency = <25000000>;
++ };
++};
++
++&gpio_chip0 {
++ status = "okay";
++};
++
++&gpio_chip1 {
++ status = "okay";
++ interrupt-controller;
++ #interrupt-cells = <2>;
++};
++
++&gpio_chip2 {
++ status = "okay";
++};
++
++&gpio_chip3 {
++ status = "okay";
++};
++
++&gpio_chip4 {
++ status = "okay";
++};
++
++&gpio_chip5 {
++ status = "okay";
++};
++
++&gpio_chip6 {
++ status = "okay";
++};
++
++&gpio_chip7 {
++ status = "okay";
++};
++
++&gpio_chip8 {
++ status = "okay";
++};
++
++&gpio_chip9 {
++ status = "okay";
++};
++
++&gpio_chip10 {
++ status = "okay";
++};
++
++&gpio_chip11 {
++ status = "okay";
++};
++
++&gpio_chip12 {
++ status = "okay";
++};
++
++&gpio_chip13 {
++ status = "okay";
++};
++
++&gpio_chip14 {
++ status = "okay";
++};
++
++&gpio_chip15 {
++ status = "okay";
++};
++&gpio_chip16 {
++ status = "okay";
++};
++&gpio_chip17 {
++ status = "okay";
++};
++
++&sfc {
++ sfc {
++ compatible = "jedec,spi-nor";
++ reg = <0>;
++ spi-max-frequency = <160000000>;
++ m25p,fast-read;
++ };
++};
++
++&snfc {
++ nand {
++ compatible = "jedec,spi-nand";
++ reg = <0>;
++ spi-max-frequency = <160000000>;
++ };
++};
++
++&nfc {
++ nand {
++ compatible = "jedec,nand";
++ reg = <0>;
++ nand-max-frequency = <200000000>;
++ };
++};
++
++&mdio {
++ ethphy: ethernet-phy@1 {
++ reg = <1>;
++ };
++};
++&mdio1 {
++ ethphy1: ethernet-phy@3 {
++ reg = <3>;
++ };
++};
++
++&gmac {
++ phy-handle = <ðphy>;
++ phy-mode = "rgmii";
++};
++
++&gmac1 {
++ phy-handle = <ðphy1>;
++ phy-mode = "rgmii";
++};
++
++&pcie0 {
++ status = "okay";
++};
++
++&edmacv310_0 {
++ status = "disabled";
++};
++
++&adc {
++ status = "okay";
++};
++
++&pwm {
++ status = "okay";
++};
++
++&mmc1 {
++ status = "okay";
++};
++
++&mmc2 {
++ status = "okay";
++};
++
++&mmc0 {
++ status = "okay";
++};
++
+diff --git a/arch/arm64/boot/dts/vendor/ss928v100.dtsi b/arch/arm64/boot/dts/vendor/ss928v100.dtsi
+new file mode 100644
+index 000000000000..5174c39d4923
+--- /dev/null
++++ b/arch/arm64/boot/dts/vendor/ss928v100.dtsi
+@@ -0,0 +1,1107 @@
++/* Copyright (c) 2017 Shenshu Technologies Co., Ltd.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program. If not, see .
++ *
++ */
++
++/* reserved for arm trustedfirmware */
++#include
++#include
++#include
++/ {
++ #address-cells = <2>;
++ #size-cells = <2>;
++
++ interrupt-parent = <&gic>;
++
++ gic: interrupt-controller@12400000 {
++ compatible = "arm,gic-v3";
++ #interrupt-cells = <3>;
++ #address-cells = <0>;
++ interrupt-controller;
++ reg = <0x0 0x12400000 0x0 0x10000>, /* gic distributor base */
++ <0x0 0x12440000 0x0 0x140000>; /* gic redistributor base */
++ };
++
++ psci {
++ compatible = "arm,psci-0.2";
++ method = "smc";
++ };
++
++ pmu {
++ compatible = "arm,armv8-pmuv3";
++ interrupts = ;
++ };
++
++ clock: clock0 {
++ compatible = "vendor,ss928v100_clock", "syscon";
++ #clock-cells = <1>;
++ #reset-cells = <2>;
++ #address-cells = <1>;
++ #size-cells = <1>;
++ reg = <0x0 0x11010000 0x0 0x44a0>;
++ };
++
++ smmu0: smmu_npu@14040000 {
++ compatible = "arm,smmu-v3";
++ reg = <0x0 0x14040000 0x0 0x40000>; //SMMU TCU
++ interrupts = ;
++ interrupt-names = "combined";
++ #iommu-cells = <0x1>;
++ vendor,broken-prefetch-cmd;
++ };
++
++ svm0: svm_npu@14020000 {
++ compatible = "vendor,svm";
++ crg-base = <0x11010000>;
++ crg-size = <0x10000>;
++ npu_crg_6560 = <0x6680>;
++ ranges;
++ #size-cells = <0x2>;
++ #address-cells = <0x2>;
++
++ svm_aicore {
++ reg = <0x0 0x14020000 0x0 0x10000>;
++ iommus = <&smmu0 0x1>;
++ dma-can-stall;
++ pasid-num-bits = <16>;
++ };
++ };
++
++ smmu1: smmu_pqp@0x15410000 {
++ compatible = "arm,smmu-v3";
++ reg = <0x0 0x15410000 0x0 0x40000>; /*SMMU TCU*/
++
++ interrupts = ;
++ interrupt-names = "combined";
++ #iommu-cells = <0x1>;
++ vendor,broken-prefetch-cmd;
++ };
++
++ svm1: svm_pqp@15400000 {
++ compatible = "vendor,svm";
++ ranges;
++ #size-cells = <0x2>;
++ #address-cells = <0x2>;
++ crg-base = <0x11010000>;
++ crg-size = <0x10000>;
++ pqp_crg_6592 = <0x6700>;
++ svm_aicore {
++ reg = <0x0 0x15400000 0x0 0x10000>;
++ iommus = <&smmu1 0x1>;
++ dma-can-stall;
++ pasid-num-bits = <16>;
++ };
++
++ svm_hwts {
++ iommus = <&smmu1 0x2>;
++ dma-can-stall;
++ pasid-bits = <0x10>;
++ vendor,smmu_bypass;
++ };
++ };
++
++ firmware {
++ optee {
++ compatible = "linaro,optee-tz";
++ method = "smc";
++ };
++ };
++
++ ipcm: ipcm@11031000 {
++ compatible = "vendor,ipcm-interrupt";
++ interrupt-parent = <&gic>;
++ interrupts = , <0 27 IRQ_TYPE_LEVEL_HIGH>;
++ reg = <0x0 0x11031000 0x0 0x1000>;
++ status = "disabled";
++
++ };
++
++ soc {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "simple-bus";
++ device_type = "soc";
++ ranges = <0x0 0x00000000 0x0 0xffffffff>;
++
++ clk_3m: clk_3m {
++ compatible = "fixed-clock";
++ #clock-cells = <0>;
++ clock-frequency = <3000000>;
++ };
++
++ amba {
++ compatible = "arm,amba-bus";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges;
++
++ arm-timer {
++ compatible = "arm,armv8-timer";
++ interrupts = ,
++ ;
++ clock-frequency = <24000000>;
++ always-on;
++ };
++
++ timer@11000000 {
++ compatible = "vendor,bsp_sp804";
++ reg = <0x11000000 0x1000>, /* clocksource */
++ <0x11001000 0x1000>,
++ <0x11002000 0x1000>,
++ <0x11003000 0x1000>,
++ <0x11004000 0x1000>;
++
++ interrupts = ,
++ ,
++ ,
++ ;
++
++ clocks = <&clk_3m>;
++ clock-names = "apb_pclk";
++ };
++
++ uart0: uart@11040000 {
++ compatible = "arm,pl011", "arm,primecell";
++ reg = <0x11040000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_UART0_CLK>;
++ clock-names = "apb_pclk";
++ /* dmas = <&edmacv310_0 20 20>, <&edmacv310_0 21 21>; */
++ /* dma-names = "rx","tx"; */
++ status = "disabled";
++ };
++
++ uart1: uart@11041000 {
++ compatible = "arm,pl011", "arm,primecell";
++ reg = <0x11041000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_UART1_CLK>;
++ clock-names = "apb_pclk";
++ /* dmas = <&edmacv310_0 22 22>, <&edmacv310_0 23 23>; */
++ /* dma-names = "rx","tx"; */
++ status = "disabled";
++ };
++
++ uart2: uart@11042000 {
++ compatible = "arm,pl011", "arm,primecell";
++ reg = <0x11042000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_UART2_CLK>;
++ clock-names = "apb_pclk";
++ /* dmas = <&edmacv310_0 24 24>, <&edmacv310_0 25 25>; */
++ /* dma-names = "rx","tx"; */
++ status = "disabled";
++ };
++
++ uart3: uart@11043000 {
++ compatible = "arm,pl011", "arm,primecell";
++ reg = <0x11043000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_UART3_CLK>;
++ clock-names = "apb_pclk";
++ /* dmas = <&edmacv310_0 26 26>, <&edmacv310_0 27 27>; */
++ /* dma-names = "rx","tx"; */
++ status = "disabled";
++ };
++
++ uart4: uart@11044000 {
++ compatible = "arm,pl011", "arm,primecell";
++ reg = <0x11044000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_UART4_CLK>;
++ clock-names = "apb_pclk";
++ /* dmas = <&edmacv310_0 28 28>, <&edmacv310_0 29 29>; */
++ /* dma-names = "rx","tx"; */
++ status = "disabled";
++ };
++
++ uart5: uart@11045000 {
++ compatible = "arm,pl011", "arm,primecell";
++ reg = <0x11045000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_UART5_CLK>;
++ clock-names = "apb_pclk";
++ /* dmas = <&edmacv310_0 30 30>, <&edmacv310_0 31 31>; */
++ /* dma-names = "rx","tx"; */
++ status = "disabled";
++ };
++
++ i2c_bus0: i2c@11060000 {
++ compatible = "vendor,i2c";
++ reg = <0x11060000 0x1000>;
++ clocks = <&clock SS928V100_I2C0_CLK>;
++ clock-frequency = <100000>;
++ status = "disabled";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ /* dmas = <&edmacv310_0 0 0>, <&edmacv310_0 1 1>; */
++ /* dma-names = "rx","tx"; */
++ rtc: rtc@32 {
++ compatible = "epson,rx8900";
++ reg = <0x32>;
++ epson,vdet-disable;
++ trickle-diode-disable;
++ };
++ gt911: gt911@5d {
++ compatible = "goodix,gt911";
++ reg = <0x5d>;
++ interrupt-parent = <&gpio_chip8>;
++ interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
++ irq-gpios = <&gpio_chip8 7 0>;
++ reset-gpios = <&gpio_chip9 1 0>;
++ status = "okay";
++ };
++ };
++
++ i2c_bus1: i2c@11061000 {
++ compatible = "vendor,i2c";
++ reg = <0x11061000 0x1000>;
++ clocks = <&clock SS928V100_I2C1_CLK>;
++ clock-frequency = <100000>;
++ /* dmas = <&edmacv310_0 2 2>, <&edmacv310_0 3 3>; */
++ /* dma-names = "rx","tx"; */
++ status = "disabled";
++ };
++
++ i2c_bus2: i2c@11062000 {
++ compatible = "vendor,i2c";
++ reg = <0x11062000 0x1000>;
++ clocks = <&clock SS928V100_I2C2_CLK>;
++ clock-frequency = <100000>;
++ /* dmas = <&edmacv310_0 4 4>, <&edmacv310_0 5 5>; */
++ /* dma-names = "rx","tx"; */
++ status = "disabled";
++ };
++
++ i2c_bus3: i2c@11063000 {
++ compatible = "vendor,i2c";
++ reg = <0x11063000 0x1000>;
++ clocks = <&clock SS928V100_I2C3_CLK>;
++ clock-frequency = <100000>;
++ /* dmas = <&edmacv310_0 6 6>, <&edmacv310_0 7 7>; */
++ /* dma-names = "rx","tx"; */
++ status = "disabled";
++ };
++
++ i2c_bus4: i2c@11064000 {
++ compatible = "vendor,i2c";
++ reg = <0x11064000 0x1000>;
++ clocks = <&clock SS928V100_I2C4_CLK>;
++ clock-frequency = <100000>;
++ /* dmas = <&edmacv310_0 8 8>, <&edmacv310_0 9 9>; */
++ /* dma-names = "rx","tx"; */
++ status = "disabled";
++ };
++
++ i2c_bus5: i2c@11065000 {
++ compatible = "vendor,i2c";
++ reg = <0x11065000 0x1000>;
++ clocks = <&clock SS928V100_I2C5_CLK>;
++ clock-frequency = <100000>;
++ /* dmas = <&edmacv310_0 10 10>, <&edmacv310_0 11 11>; */
++ /* dma-names = "rx","tx"; */
++ status = "disabled";
++ };
++
++ spi_bus0: spi@11070000 {
++ compatible = "arm,pl022", "arm,primecell";
++ arm,primecell-periphid = <0x00800022>;
++ reg = <0x11070000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_SPI0_CLK>;
++ clock-names = "apb_pclk";
++ #address-cells = <1>;
++ spi,slave_mode = <0>;
++ #size-cells = <0>;
++ status = "disabled";
++ num-cs = <1>;
++ /* dmas = <&edmacv310_0 12 12>, <&edmacv310_0 13 13>; */
++ /* dma-names = "rx","tx"; */
++ };
++
++ spi_bus1: spi@11071000 {
++ compatible = "arm,pl022", "arm,primecell";
++ arm,primecell-periphid = <0x00800022>;
++ reg = <0x11071000 0x1000>, <0x110d2100 0x4>;
++ interrupts = ;
++ clocks = <&clock SS928V100_SPI1_CLK>;
++ clock-names = "apb_pclk";
++ #address-cells = <1>;
++ spi,slave_mode = <0>;
++ #size-cells = <0>;
++ status = "disabled";
++ num-cs = <2>;
++ spi_cs_sb = <2>;
++ spi_cs_mask_bit = <0x4>;
++ /* dmas = <&edmacv310_0 14 14>, <&edmacv310_0 15 15>; */
++ /* dma-names = "rx","tx"; */
++ };
++
++ spi_bus2: spi@11073000 {
++ compatible = "arm,pl022", "arm,primecell";
++ arm,primecell-periphid = <0x00800022>;
++ reg = <0x11073000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_SPI2_CLK>;
++ clock-names = "apb_pclk";
++ #address-cells = <1>;
++ spi,slave_mode = <0>;
++ #size-cells = <0>;
++ status = "disabled";
++ num-cs = <1>;
++ /* dmas = <&edmacv310_0 16 16>, <&edmacv310_0 17 17>; */
++ /* dma-names = "rx","tx"; */
++ };
++
++ spi_bus3: spi@11074000 {
++ compatible = "arm,pl022", "arm,primecell";
++ arm,primecell-periphid = <0x00800022>;
++ reg = <0x11074000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_SPI3_CLK>;
++ clock-names = "apb_pclk";
++ spi,slave_mode = <0>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "disabled";
++ num-cs = <1>;
++ /* dmas = <&edmacv310_0 18 18>, <&edmacv310_0 19 19>; */
++ /* dma-names = "rx","tx"; */
++ };
++
++ gpio_chip0: gpio_chip@11090000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x11090000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip1: gpio_chip@11091000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x11091000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip2: gpio_chip@11092000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x11092000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip3: gpio_chip@11093000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x11093000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip4: gpio_chip@11094000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x11094000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip5: gpio_chip@11095000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x11095000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip6: gpio_chip@11096000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x11096000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip7: gpio_chip@11097000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x11097000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip8: gpio_chip@11098000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x11098000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip9: gpio_chip@11099000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x11099000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip10: gpio_chip@1109A000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x1109A000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip11: gpio_chip@1109B000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x1109B000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip12: gpio_chip@1109C000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x1109C000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip13: gpio_chip@1109D000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x1109D000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip14: gpio_chip@1109E000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x1109E000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip15: gpio_chip@1109F000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x1109F000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip16: gpio_chip@110a0000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x110a0000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ gpio_chip17: gpio_chip@110a1000 {
++ compatible = "arm,pl061", "arm,primecell";
++ reg = <0x110a1000 0x1000>;
++ interrupts = ;
++ #gpio-cells = <2>;
++ clocks = <&clock SS928V100_FIXED_50M>;
++ clock-names = "apb_pclk";
++ status = "disabled";
++ };
++
++ };
++
++ misc_ctrl: misc-controller@11024000 {
++ compatible = "vendor,miscctrl", "syscon";
++ reg = <0x11024000 0x5000>;
++ };
++
++ ioconfig0: ioconfig0@10230000 {
++ compatible = "vendor,ioconfig", "syscon";
++ reg = <0x10230000 0x10000>;
++ };
++
++ ioconfig1: ioconfig1@102f0000 {
++ compatible = "vendor,ioconfig", "syscon";
++ reg = <0x102f0000 0x10000>;
++ };
++
++ /*FLASH DTS nodes*/
++ fmc: flash-memory-controller@10000000 {
++ compatible = "vendor,fmc";
++ reg = <0x10000000 0x1000>, <0x0f000000 0x1000000>;
++ reg-names = "control", "memory";
++ clocks = <&clock SS928V100_FMC_CLK>;
++ max-dma-size = <0x2000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ sfc:spi_nor_controller {
++ compatible = "vendor,fmc-spi-nor";
++ assigned-clocks = <&clock SS928V100_FMC_CLK>;
++ assigned-clock-rates = <24000000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ };
++
++ snfc:spi_nand_controller {
++ compatible = "vendor,fmc-spi-nand";
++ assigned-clocks = <&clock SS928V100_FMC_CLK>;
++ assigned-clock-rates = <24000000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ };
++
++ nfc:parallel-nand-controller {
++ compatible = "vendor,fmc-nand";
++ assigned-clocks = <&clock SS928V100_FMC_CLK>;
++ assigned-clock-rates = <200000000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ };
++ };
++
++ /*ethernet DTS nodes*/
++ mdio: mdio@102903c0 {
++ compatible = "vendor,gemac-mdio";
++ reg = <0x102903c0 0x20>;
++ clocks = <&clock SS928V100_ETH_CLK>;
++ resets = <&clock 0x37cc 0>;
++ reset-names = "phy_reset";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ };
++
++ mdio1: mdio@102a03c0 {
++ compatible = "vendor,gemac-mdio";
++ reg = <0x102a03c0 0x20>;
++ clocks = <&clock SS928V100_ETH1_CLK>;
++ resets = <&clock 0x380c 0>;
++ reset-names = "phy_reset";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ };
++
++ gmac: ethernet@10290000 {
++ compatible = "vendor,gmac-v5";
++ reg = <0x10290000 0x1000>,<0x1029300c 0x4>;
++ interrupts = , ,
++ , ;
++
++ clocks = <&clock SS928V100_ETH_CLK>,
++ <&clock SS928V100_ETH_MACIF_CLK>;
++ clock-names = "gmac_clk",
++ "macif_clk";
++
++ resets = <&clock 0x37c4 0>,
++ <&clock 0x37c0 0>;
++ reset-names = "port_reset",
++ "macif_reset";
++
++ mac-address = [00 00 00 00 00 00];
++ };
++
++ gmac1: ethernet@102a0000 {
++ compatible = "vendor,gmac-v5";
++ reg = <0x102a0000 0x1000>,<0x102a300c 0x4>;
++ interrupts =, ,
++ , ;
++
++ clocks = <&clock SS928V100_ETH1_CLK>,
++ <&clock SS928V100_ETH1_MACIF_CLK>;
++ clock-names = "gmac_clk",
++ "macif_clk";
++
++ resets = <&clock 0x3804 0>,
++ <&clock 0x3800 0>;
++ reset-names = "port_reset",
++ "macif_reset";
++
++ mac-address = [00 00 00 00 00 00];
++ };
++
++ /*USB DTS nodes*/
++ usb3_phy: phy3 {
++ compatible = "vendor,usb-phy";
++ reg = <0x11010000 0x10000>, <0x11024000 0x5000>, <0x11020000 0x4000>;
++ phyid = <0>;
++ };
++
++
++ xhci_0:xhci_0@0x10300000 {
++ compatible = "generic-xhci";
++ reg = <0x10300000 0x10000>;
++ interrupts = ;
++ usb2-lpm-disable;
++ };
++
++ xhci_1:xhci_1@0x10320000 {
++ compatible = "generic-xhci";
++ reg = <0x10320000 0x10000>;
++ interrupts = ;
++ usb2-lpm-disable;
++ };
++
++/*
++ bspdwc3:bspudc3@0x10320000 {
++ compatible = "snps,dwc3";
++ reg = <0x10320000 0x10000>, <0x11010000 0x10000>, <0x11020000 0x4000>;
++ interrupts = ;
++ port_speed = <0>;
++ interrupt-names = "peripheral";
++ maximum-speed = "super-speed";
++ dr_mode = "peripheral";
++ snps,dis_initiate_u1;
++ snps,dis_initiate_u2;
++ };
++*/
++
++ /*EMMC/SD/SDIO DTS nodes*/
++ mmc0: eMMC@0x10020000 {
++ compatible = "vendor,sdhci";
++ reg = <0x10020000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_MMC0_CLK>;
++ clock-names = "mmc_clk";
++ resets = <&clock 0x34c0 16>, <&clock 0x34c4 1>;
++ reset-names = "crg_reset", "dll_reset";
++ max-frequency = <200000000>;
++ crg_regmap = <&clock>;
++ non-removable;
++ iocfg_regmap = <&ioconfig0>;
++ bus-width = <8>;
++ mmc-cmd-queue;
++ cap-mmc-highspeed;
++ mmc-hs400-1_8v;
++ mmc-hs400-enhanced-strobe;
++ cap-mmc-hw-reset;
++ no-sdio;
++ no-sd;
++ devid = <0>;
++ status = "okay";
++ };
++
++ mmc1: SDIO@0x10030000 {
++ compatible = "vendor,sdhci";
++ reg = <0x10030000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_MMC1_CLK>;
++ clock-names = "mmc_clk";
++ resets = <&clock 0x35c0 16>, <&clock 0x35c4 1>;
++ reset-names = "crg_reset", "dll_reset";
++ max-frequency = <200000000>;
++ crg_regmap = <&clock>;
++ iocfg_regmap = <&ioconfig1>;
++ bus-width = ;
++ cap-sd-highspeed;
++ sd-uhs-sdr104;
++ sd-uhs-sdr50;
++ full-pwr-cycle;
++ disable-wp;
++ no-emmc;
++ no-sdio;
++ devid = <1>;
++ status = "okay";
++ };
++
++ mmc2: SDIO1@0x10040000 {
++ compatible = "vendor,sdhci";
++ reg = <0x10040000 0x1000>;
++ interrupts = ;
++ clocks = <&clock SS928V100_MMC2_CLK>;
++ clock-names = "mmc_clk";
++ resets = <&clock 0x36c0 16>, <&clock 0x36c4 1>;
++ reset-names = "crg_reset", "dll_reset";
++ max-frequency = <200000000>;
++ crg_regmap = <&clock>;
++ iocfg_regmap = <&ioconfig1>;
++ bus-width = <4>;
++ cap-sd-highspeed;
++ sd-uhs-sdr104;
++ no-emmc;
++ no-sd;
++ devid = <2>;
++ status = "okay";
++ };
++
++ pcie0: pcie@0x103d0000 {
++ device_type = "pci";
++ compatible = "vendor,pcie";
++ #size-cells = <2>;
++ #address-cells = <3>;
++ #interrupt-cells = <1>;
++ bus-range = <0x0 0xff>;
++ reg = <0x00 0x103d0000 0x00 0x2000>;
++ ranges = <0x02000000 0x00 0x30000000 0x30000000 0x00 0x10000000>;
++ interrupt-map-mask = <0x0 0x0 0x0 0x7>;
++ interrupt-map = <0x0 0x0 0x0 0x1 &gic GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH
++ 0x0 0x0 0x0 0x2 &gic GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH
++ 0x0 0x0 0x0 0x3 &gic GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH
++ 0x0 0x0 0x0 0x4 &gic GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>;
++ /* msi interrupts */
++ interrupts = ;
++ interrupt-names = "msi";
++
++ pcie_controller = <0>;
++ dev_mem_size = <0x10000000>;
++ dev_conf_size = <0x10000000>;
++ sys_ctrl_base = <0x11020000>;
++ pcie_dbi_base = <0x103d0000>;
++ ep_conf_base = <0x20000000>;
++ pcie_clk_rest_reg = <0x3a40>;
++ };
++
++ pcie_mcc: pcie_mcc@0x0 {
++ compatible = "vendor,pcie_mcc";
++ interrupts = , /* pcie0 inta */
++ , /* pcie0 intb */
++ , /* pcie0 intc */
++ , /* pcie0 intd */
++ , /* pcie0 dma*/
++ ; /* global soft irq */
++ };
++
++
++ edmacv310_0: edma-controller@10280000 {
++ compatible = "vendor,edmacv310";
++ reg = <0x10280000 0x1000>, <0x102e0024 0x4>;
++ reg-names = "dmac", "dma_peri_channel_req_sel";
++ interrupts = ;
++ clocks = <&clock SS928V100_EDMAC_CLK>,
++ <&clock SS928V100_EDMAC_AXICLK>;
++ clock-names = "apb_pclk", "axi_aclk";
++ #clock-cells = <2>;
++ resets = <&clock 0x2A80 0>;
++ reset-names = "dma-reset";
++ dma-requests = <32>;
++ dma-channels = <8>;
++ devid = <0>;
++ #dma-cells = <2>;
++ status = "disabled";
++ };
++
++ /*SDK DTS nodes*/
++ sys: sys@11010000 {
++ compatible = "vendor,sys";
++ reg = <0x11014500 0xBB00>,
++ <0x11020000 0x4000>,
++ <0x11140000 0x20000>,
++ <0X11024000 0x5000>;
++ reg-names = "crg", "sys", "ddr", "misc";
++ };
++
++ mipi_rx: mipi_rx@0x173c0000 {
++ compatible = "vendor,mipi_rx";
++ reg = <0x173c0000 0x10000>;
++ reg-names = "mipi_rx";
++ interrupts = ;
++ interrupt-names = "mipi_rx";
++ };
++
++ vi: vi@0x17400000 {
++ compatible = "vendor,vi";
++ reg = <0x17400000 0x200000>,
++ <0x17800000 0x40000>,
++ <0x17840000 0x40000>;
++ reg-names = "vi_cap0", "vi_proc0", "vi_proc1";
++ interrupts = , ,
++ ;
++ interrupt-names = "vi_cap0", "vi_proc0", "vi_proc1";
++ };
++
++ vpss: vpss@0x17900000 {
++ compatible = "vendor,vpss";
++ reg = <0x17900000 0x10000>;
++ reg-names = "vpss0";
++ interrupts = ;
++ interrupt-names = "vpss0";
++ };
++
++ vo: vo@0x17A00000 {
++ compatible = "vendor,vo";
++ reg = <0x17A00000 0x40000>;
++ reg-names = "vo";
++ interrupts = ;
++ interrupt-names = "vo";
++ };
++
++ gfbg: gfbg@0x17A00000 {
++ compatible = "vendor,gfbg";
++ reg = <0x17A00000 0x40000>;
++ reg-names = "gfbg";
++ interrupts = ;
++ interrupt-names = "gfbg";
++ };
++
++ hdmi: hdmi@0x17B40000 {
++ compatible = "vendor,hdmi";
++ reg = <0x17B40000 0x20000>,<0x17BC0000 0x10000>;
++ reg-names = "hdmi0","phy";
++ interrupts = ,,
++ ;
++ interrupt-names = "tx_aon","tx_sec","tx_pwd";
++ };
++
++ mipi_tx: mipi_tx@0x17A80000 {
++ compatible = "vendor,mipi_tx";
++ reg = <0x17A80000 0x10000>;
++ reg-names = "mipi_tx";
++ interrupts = ;
++ interrupt-names = "mipi_tx";
++ };
++
++ vgs: vgs@0x17240000 {
++ compatible = "vendor,vgs";
++ reg = <0x17240000 0x10000>, <0x17250000 0x10000>;
++ reg-names = "vgs0", "vgs1";
++ interrupts = , ;
++ interrupt-names = "vgs0", "vgs1";
++ };
++
++ vdh: vdh@0x17100000 {
++ compatible = "vendor,vdh";
++ reg = <0x17100000 0x10000>;
++ reg-names = "vdh_scd";
++ interrupts = ,,
++ ,;
++ interrupt-names = "vdh_bsp","vdh_pxp","scd","vdh_mdma";
++ };
++
++ gdc: gdc@0x172c0000 {
++ compatible = "vendor,gdc";
++ reg = <0x172c0000 0x10000>;
++ reg-names = "gdc";
++ interrupts = ;
++ interrupt-names = "gdc";
++ };
++
++ tde: tde@0x17280000 {
++ compatible = "vendor,tde";
++ reg = <0x17280000 0x10000>;
++ reg-names = "tde";
++ interrupts = ;
++ interrupt-names = "tde_osr_isr";
++ };
++
++ jpegd: jpegd@0x17180000 {
++ compatible = "vendor,jpegd";
++ reg = <0x17180000 0x10000>;
++ reg-names = "jpegd";
++ interrupts = ;
++ interrupt-names = "jpegd";
++ };
++
++ venc: venc@0x17140000 {
++ compatible = "vendor,vedu";
++ reg = <0x17140000 0x10000>,<0x171c0000 0x10000>;
++ reg-names = "vedu0","jpge";
++ interrupts = ,;
++ interrupt-names = "vedu0","jpge";
++ };
++
++ npu: npu@0x14000000 {
++ compatible = "vendor,npu";
++ reg = <0x14000000 0x100000>,
++ <0x14100000 0x200000>,<0x14300000 0x200000>,
++ <0x17150000 0x10000>,<0x11010000 0x10000>;
++ reg-names = "npu_top","npu_htws","npu_aicore",
++ "npu_peri","crg";
++ interrupts = ,,
++ ,,
++ ,,
++ ,,
++ ;
++ interrupt-names = "hwts_dfx","hwts_normal_s","hwts_debug_s",
++ "hwts_error_s","hwts_normal_ns","hwts_debug_ns",
++ "hwts_error_ns","hwts_aicpu_s","hwts_aicpu_ns";
++ };
++
++ pqp: pqp@0x15000000 {
++ compatible = "vendor,pqp";
++ reg = <0x15000000 0x10000>;
++ reg-names = "pqp";
++ interrupts = , ;
++ interrupt-names = "pqp_ns","pqp_s";
++ };
++
++ svp_npu: svp_npu@0x15000000 {
++ compatible = "vendor,svp_npu";
++ reg = <0x15000000 0x10000>;
++ reg-names = "svp_npu";
++ interrupts = , ;
++ interrupt-names = "svp_npu_ns","svp_npu_s";
++ };
++
++ ive: ive@0x17000000 {
++ compatible = "vendor,ive";
++ reg = <0x17000000 0x10000>;
++ reg-names = "ive";
++ interrupts = ;
++ interrupt-names = "ive";
++ };
++
++ mau: mau@0x17030000 {
++ compatible = "vendor,mau";
++ reg = <0x17030000 0x10000>;
++ reg-names = "mau0";
++ interrupts = ;
++ interrupt-names = "mau0";
++ };
++
++ dpu_rect: dpu_rect@0x17030000 {
++ compatible = "vendor,dpu_rect";
++ reg = <0x17030000 0x10000>;
++ reg-names = "dpu_rect";
++ interrupts = ;
++ interrupt-names = "rect";
++ };
++
++ dpu_match: dpu_match@0x17030000 {
++ compatible = "vendor,dpu_match";
++ reg = <0x17030000 0x10000>;
++ reg-names = "dpu_match";
++ interrupts = ;
++ interrupt-names = "match";
++ };
++
++ dsp: dsp@0x16110000 {
++ compatible = "vendor,dsp";
++ reg = <0x16110000 0x20000>,<0x16310000 0x20000>;
++ reg-names = "dsp0","dsp1";
++ };
++
++ avs: avs@0x17930000 {
++ compatible = "vendor,avs";
++ reg = <0x17930000 0x10000>;
++ reg-names = "avs";
++ interrupts = ;
++ interrupt-names = "avs";
++ };
++
++ aiao: aiao@17c00000 {
++ compatible = "vendor,aiao";
++ reg = <0x17c00000 0x10000>,<0x17c40000 0x10000>;
++ reg-names = "aiao","acodec";
++ interrupts = ;
++ interrupt-names = "AIO";
++ };
++
++ cipher: cipher@0x10100000 {
++ compatible = "vendor,cipher";
++ reg = <0x10100000 0x10000>;
++ reg-names = "cipher";
++ interrupts = ,,
++ ,;
++ interrupt-names = "nsec_spacc","sec_spacc","nsec_pke","sec_pke";
++ };
++
++ klad: klad@0x10110000 {
++ compatible = "vendor,klad";
++ reg = <0x10110000 0x1000>;
++ reg-names = "klad";
++ interrupts = ,,
++ ,;
++ interrupt-names = "nsec_rkp","sec_rkp","nsec_klad","sec_klad";
++ };
++
++ otp: otp@0x10120000 {
++ compatible = "vendor,otp";
++ reg = <0x10120000 0x1000>;
++ reg-names = "otp";
++ };
++
++ adc: adc@0x11080000 {
++ compatible = "vendor,lsadc";
++ reg = <0x11080000 0x1000>;
++ reg-names = "lsadc";
++ interrupts = <0 72 4>;
++ interrupt-names = "lsadc";
++ clocks = <&clock SS928V100_LSADC_CLK>;
++ clock-names = "lsadc-clk";
++ resets = <&clock 0x46c0 0>;
++ reset-names = "lsadc-crg";
++ status = "disabled";
++ };
++
++ ir: ir@0x110F0000 {
++ compatible = "vendor,ir";
++ reg = <0x110F0000 0x10000>;
++ reg-names = "ir";
++ interrupts = ;
++ interrupt-names = "ir";
++ };
++
++ wdg: wdg@0x11030000 {
++ compatible = "vendor,wdg";
++ reg = <0x11030000 0x1000>;
++ reg-names = "wdg0";
++ interrupts = ;
++ interrupt-names = "wdg";
++ };
++
++ pwm: pwm@0x1102D000 {
++ compatible = "vendor,pwm";
++ reg = <0x110B0000 0x1000>, <0x1102D000 0x1000>;
++ reg-names = "pwm0", "pwm1";
++ clocks = <&clock SS928V100_PWM0_CLK>, <&clock SS928V100_PWM1_CLK>;
++ clock-names = "pwm0", "pwm1";
++ resets = <&clock 0x4588 0>, <&clock 0x4590 0>;
++ reset-names = "pwm0", "pwm1";
++ status = "disabled";
++ };
++
++ };
++};
++
+diff --git a/arch/arm64/configs/hieulerpi1_defconfig b/arch/arm64/configs/hieulerpi1_defconfig
+new file mode 100644
+index 000000000000..481993463b25
+--- /dev/null
++++ b/arch/arm64/configs/hieulerpi1_defconfig
+@@ -0,0 +1,5630 @@
++#
++# Automatically generated file; DO NOT EDIT.
++# Linux/arm64 5.10.0 Kernel Configuration
++#
++CONFIG_CC_VERSION_TEXT="aarch64-openeuler-linux-gnu-gcc (crosstool-NG 1.26.0) 12.3.1"
++CONFIG_CC_IS_GCC=y
++CONFIG_GCC_VERSION=120301
++CONFIG_LD_VERSION=241000000
++CONFIG_CLANG_VERSION=0
++CONFIG_LLD_VERSION=0
++CONFIG_CC_HAS_ASM_GOTO=y
++CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
++CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y
++CONFIG_CC_HAS_ASM_INLINE=y
++CONFIG_IRQ_WORK=y
++CONFIG_BUILDTIME_TABLE_SORT=y
++CONFIG_THREAD_INFO_IN_TASK=y
++
++#
++# General setup
++#
++CONFIG_INIT_ENV_ARG_LIMIT=32
++# CONFIG_COMPILE_TEST is not set
++CONFIG_LOCALVERSION="-openeuler"
++# CONFIG_LOCALVERSION_AUTO is not set
++CONFIG_BUILD_SALT=""
++CONFIG_DEFAULT_INIT=""
++CONFIG_DEFAULT_HOSTNAME="(none)"
++# CONFIG_SWAP is not set
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++CONFIG_POSIX_MQUEUE=y
++CONFIG_POSIX_MQUEUE_SYSCTL=y
++# CONFIG_WATCH_QUEUE is not set
++CONFIG_CROSS_MEMORY_ATTACH=y
++CONFIG_USELIB=y
++# CONFIG_AUDIT is not set
++CONFIG_HAVE_ARCH_AUDITSYSCALL=y
++
++#
++# IRQ subsystem
++#
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
++CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
++CONFIG_GENERIC_IRQ_MIGRATION=y
++CONFIG_HARDIRQS_SW_RESEND=y
++CONFIG_IRQ_DOMAIN=y
++CONFIG_IRQ_DOMAIN_HIERARCHY=y
++CONFIG_GENERIC_IRQ_IPI=y
++CONFIG_GENERIC_MSI_IRQ=y
++CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
++CONFIG_IRQ_MSI_IOMMU=y
++CONFIG_HANDLE_DOMAIN_IRQ=y
++CONFIG_IRQ_FORCED_THREADING=y
++CONFIG_SPARSE_IRQ=y
++# CONFIG_GENERIC_IRQ_DEBUGFS is not set
++# end of IRQ subsystem
++
++CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_ARCH_HAS_TICK_BROADCAST=y
++CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
++
++#
++# Timers subsystem
++#
++CONFIG_TICK_ONESHOT=y
++CONFIG_HZ_PERIODIC=y
++# CONFIG_NO_HZ_IDLE is not set
++# CONFIG_NO_HZ_FULL is not set
++# CONFIG_NO_HZ is not set
++CONFIG_HIGH_RES_TIMERS=y
++# CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE is not set
++# end of Timers subsystem
++
++CONFIG_PREEMPT_NONE=y
++# CONFIG_PREEMPT_VOLUNTARY is not set
++# CONFIG_PREEMPT is not set
++
++#
++# CPU/Task time and stats accounting
++#
++CONFIG_TICK_CPU_ACCOUNTING=y
++# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
++# CONFIG_IRQ_TIME_ACCOUNTING is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++CONFIG_PSI=y
++# CONFIG_PSI_DEFAULT_DISABLED is not set
++# end of CPU/Task time and stats accounting
++
++CONFIG_CPU_ISOLATION=y
++
++#
++# RCU Subsystem
++#
++CONFIG_TREE_RCU=y
++# CONFIG_RCU_EXPERT is not set
++CONFIG_SRCU=y
++CONFIG_TREE_SRCU=y
++CONFIG_TASKS_RCU_GENERIC=y
++CONFIG_TASKS_TRACE_RCU=y
++CONFIG_RCU_STALL_COMMON=y
++CONFIG_RCU_NEED_SEGCBLIST=y
++# end of RCU Subsystem
++
++# CONFIG_IKCONFIG is not set
++# CONFIG_IKHEADERS is not set
++CONFIG_LOG_BUF_SHIFT=14
++CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
++CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
++CONFIG_GENERIC_SCHED_CLOCK=y
++
++#
++# Scheduler features
++#
++# end of Scheduler features
++
++CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
++CONFIG_CC_HAS_INT128=y
++CONFIG_ARCH_SUPPORTS_INT128=y
++CONFIG_CGROUPS=y
++CONFIG_PAGE_COUNTER=y
++CONFIG_MEMCG=y
++CONFIG_MEMCG_KMEM=y
++CONFIG_MEMCG_MEMFS_INFO=y
++CONFIG_BLK_CGROUP=y
++CONFIG_CGROUP_WRITEBACK=y
++CONFIG_CGROUP_V1_WRITEBACK=y
++CONFIG_CGROUP_SCHED=y
++CONFIG_QOS_SCHED=y
++CONFIG_QOS_SCHED_MULTILEVEL=y
++CONFIG_QOS_SCHED_SMT_EXPELLER=y
++CONFIG_QOS_SCHED_PRIO_LB=y
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_CFS_BANDWIDTH=y
++# CONFIG_RT_GROUP_SCHED is not set
++# CONFIG_QOS_SCHED_DYNAMIC_AFFINITY is not set
++CONFIG_CGROUP_PIDS=y
++CONFIG_CGROUP_RDMA=y
++CONFIG_CGROUP_FREEZER=y
++CONFIG_CPUSETS=y
++CONFIG_PROC_PID_CPUSET=y
++CONFIG_CGROUP_DEVICE=y
++CONFIG_CGROUP_CPUACCT=y
++# CONFIG_CGROUP_PERF is not set
++CONFIG_CGROUP_BPF=y
++# CONFIG_CGROUP_DEBUG is not set
++CONFIG_SOCK_CGROUP_DATA=y
++CONFIG_CGROUP_FILES=y
++CONFIG_NAMESPACES=y
++CONFIG_UTS_NS=y
++CONFIG_TIME_NS=y
++CONFIG_IPC_NS=y
++# CONFIG_USER_NS is not set
++CONFIG_PID_NS=y
++CONFIG_NET_NS=y
++CONFIG_SCHED_STEAL=y
++# CONFIG_CHECKPOINT_RESTORE is not set
++# CONFIG_SCHED_AUTOGROUP is not set
++# CONFIG_SYSFS_DEPRECATED is not set
++CONFIG_RELAY=y
++# CONFIG_BLK_DEV_INITRD is not set
++# CONFIG_BOOT_CONFIG is not set
++CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_LD_ORPHAN_WARN=y
++CONFIG_SYSCTL=y
++CONFIG_SYSCTL_EXCEPTION_TRACE=y
++CONFIG_BPF=y
++CONFIG_EXPERT=y
++CONFIG_MULTIUSER=y
++# CONFIG_SGETMASK_SYSCALL is not set
++CONFIG_SYSFS_SYSCALL=y
++# CONFIG_FHANDLE is not set
++CONFIG_POSIX_TIMERS=y
++CONFIG_PRINTK=y
++CONFIG_PRINTK_NMI=y
++CONFIG_BUG=y
++CONFIG_ELF_CORE=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_FUTEX_PI=y
++CONFIG_HAVE_FUTEX_CMPXCHG=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_AIO=y
++CONFIG_IO_URING=y
++CONFIG_ADVISE_SYSCALLS=y
++CONFIG_MEMBARRIER=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++CONFIG_KALLSYMS_BASE_RELATIVE=y
++CONFIG_BPF_SYSCALL=y
++CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
++# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set
++# CONFIG_BPF_PRELOAD is not set
++CONFIG_USERFAULTFD=y
++CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
++# CONFIG_KCMP is not set
++CONFIG_RSEQ=y
++# CONFIG_DEBUG_RSEQ is not set
++CONFIG_EMBEDDED=y
++CONFIG_HAVE_PERF_EVENTS=y
++# CONFIG_PC104 is not set
++
++#
++# Kernel Performance Events And Counters
++#
++CONFIG_PERF_EVENTS=y
++# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
++# end of Kernel Performance Events And Counters
++
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++# CONFIG_SLUB_MEMCG_SYSFS_ON is not set
++# CONFIG_COMPAT_BRK is not set
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++CONFIG_SLAB_MERGE_DEFAULT=y
++# CONFIG_SLAB_FREELIST_RANDOM is not set
++# CONFIG_SLAB_FREELIST_HARDENED is not set
++# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set
++CONFIG_SLUB_CPU_PARTIAL=y
++CONFIG_SYSTEM_DATA_VERIFICATION=y
++# CONFIG_PROFILING is not set
++CONFIG_KABI_RESERVE=y
++CONFIG_KABI_SIZE_ALIGN_CHECKS=y
++# end of General setup
++
++CONFIG_ARM64=y
++CONFIG_64BIT=y
++CONFIG_MMU=y
++CONFIG_ARM64_PAGE_SHIFT=12
++CONFIG_ARM64_CONT_PTE_SHIFT=4
++CONFIG_ARM64_CONT_PMD_SHIFT=4
++CONFIG_ARCH_MMAP_RND_BITS_MIN=18
++CONFIG_ARCH_MMAP_RND_BITS_MAX=24
++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
++CONFIG_LOCKDEP_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_GENERIC_BUG=y
++CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CSUM=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_ZONE_DMA=y
++CONFIG_ZONE_DMA32=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
++CONFIG_SMP=y
++CONFIG_KERNEL_MODE_NEON=y
++CONFIG_FIX_EARLYCON_MEM=y
++CONFIG_PGTABLE_LEVELS=3
++CONFIG_ARCH_SUPPORTS_UPROBES=y
++CONFIG_ARCH_PROC_KCORE_TEXT=y
++CONFIG_ARCH_HAS_CPU_RELAX=y
++
++#
++# Platform selection
++#
++# CONFIG_ARCH_ACTIONS is not set
++# CONFIG_ARCH_AGILEX is not set
++# CONFIG_ARCH_SUNXI is not set
++# CONFIG_ARCH_ALPINE is not set
++# CONFIG_ARCH_BCM2835 is not set
++# CONFIG_ARCH_BCM_IPROC is not set
++# CONFIG_ARCH_BERLIN is not set
++# CONFIG_ARCH_BITMAIN is not set
++# CONFIG_ARCH_BRCMSTB is not set
++# CONFIG_ARCH_EXYNOS is not set
++# CONFIG_ARCH_SPARX5 is not set
++# CONFIG_ARCH_K3 is not set
++# CONFIG_ARCH_LAYERSCAPE is not set
++# CONFIG_ARCH_LG1K is not set
++# CONFIG_ARCH_HISI is not set
++CONFIG_ARCH_BSP=y
++# CONFIG_ARCH_SS528V100 is not set
++# CONFIG_ARCH_SS625V100 is not set
++# CONFIG_ARCH_SS919V100 is not set
++# CONFIG_ARCH_SS015V100 is not set
++CONFIG_ARCH_SS928V100=y
++# CONFIG_ARCH_SS927V100 is not set
++# CONFIG_ARCH_KEEMBAY is not set
++# CONFIG_ARCH_MEDIATEK is not set
++# CONFIG_ARCH_MESON is not set
++# CONFIG_ARCH_MVEBU is not set
++# CONFIG_ARCH_MXC is not set
++# CONFIG_ARCH_PHYTIUM is not set
++# CONFIG_ARCH_QCOM is not set
++# CONFIG_ARCH_REALTEK is not set
++# CONFIG_ARCH_RENESAS is not set
++# CONFIG_ARCH_ROCKCHIP is not set
++# CONFIG_ARCH_S32 is not set
++# CONFIG_ARCH_SEATTLE is not set
++# CONFIG_ARCH_STRATIX10 is not set
++# CONFIG_ARCH_SYNQUACER is not set
++# CONFIG_ARCH_TEGRA is not set
++# CONFIG_ARCH_SPRD is not set
++# CONFIG_ARCH_THUNDER is not set
++# CONFIG_ARCH_THUNDER2 is not set
++# CONFIG_ARCH_UNIPHIER is not set
++# CONFIG_ARCH_VEXPRESS is not set
++# CONFIG_ARCH_VISCONTI is not set
++# CONFIG_ARCH_XGENE is not set
++# CONFIG_ARCH_ZX is not set
++# CONFIG_ARCH_ZYNQMP is not set
++# end of Platform selection
++
++CONFIG_HAVE_LIVEPATCH_WO_FTRACE=y
++
++#
++# Enable Livepatch
++#
++# end of Enable Livepatch
++
++#
++# Kernel Features
++#
++
++#
++# ARM errata workarounds via the alternatives framework
++#
++CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y
++CONFIG_ARM64_ERRATUM_826319=y
++CONFIG_ARM64_ERRATUM_827319=y
++CONFIG_ARM64_ERRATUM_824069=y
++CONFIG_ARM64_ERRATUM_819472=y
++CONFIG_ARM64_ERRATUM_832075=y
++CONFIG_ARM64_ERRATUM_843419=y
++CONFIG_ARM64_ERRATUM_1024718=y
++CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y
++CONFIG_ARM64_ERRATUM_1165522=y
++CONFIG_ARM64_ERRATUM_1319367=y
++CONFIG_ARM64_ERRATUM_1530923=y
++CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y
++CONFIG_ARM64_ERRATUM_1286807=y
++CONFIG_ARM64_ERRATUM_1463225=y
++CONFIG_ARM64_ERRATUM_1542419=y
++CONFIG_ARM64_ERRATUM_1508412=y
++CONFIG_CAVIUM_ERRATUM_22375=y
++CONFIG_CAVIUM_ERRATUM_23154=y
++CONFIG_CAVIUM_ERRATUM_27456=y
++CONFIG_CAVIUM_ERRATUM_30115=y
++CONFIG_CAVIUM_TX2_ERRATUM_219=y
++CONFIG_FUJITSU_ERRATUM_010001=y
++CONFIG_HISILICON_ERRATUM_161600802=y
++# CONFIG_HISILICON_ERRATUM_1980005 is not set
++CONFIG_HISILICON_ERRATUM_162100801=y
++CONFIG_HISILICON_ERRATUM_162100125=y
++CONFIG_QCOM_FALKOR_ERRATUM_1003=y
++CONFIG_QCOM_FALKOR_ERRATUM_1009=y
++CONFIG_QCOM_QDF2400_ERRATUM_0065=y
++CONFIG_QCOM_FALKOR_ERRATUM_E1041=y
++CONFIG_SOCIONEXT_SYNQUACER_PREITS=y
++CONFIG_HISILICON_ERRATUM_HIP08_RU_PREFETCH=y
++# CONFIG_HISILICON_HIP08_RU_PREFETCH_DEFAULT_OFF is not set
++# end of ARM errata workarounds via the alternatives framework
++
++CONFIG_ARM64_4K_PAGES=y
++# CONFIG_ARM64_16K_PAGES is not set
++# CONFIG_ARM64_64K_PAGES is not set
++CONFIG_ARM64_VA_BITS_39=y
++# CONFIG_ARM64_VA_BITS_48 is not set
++CONFIG_ARM64_VA_BITS=39
++CONFIG_ARM64_PA_BITS_48=y
++CONFIG_ARM64_PA_BITS=48
++# CONFIG_CPU_BIG_ENDIAN is not set
++CONFIG_CPU_LITTLE_ENDIAN=y
++CONFIG_SCHED_MC=y
++CONFIG_SCHED_CLUSTER=y
++CONFIG_SCHED_SMT=y
++CONFIG_NR_CPUS=4
++CONFIG_HOTPLUG_CPU=y
++# CONFIG_ARM64_BOOTPARAM_HOTPLUG_CPU0 is not set
++# CONFIG_NUMA is not set
++CONFIG_HZ_100=y
++# CONFIG_HZ_250 is not set
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=100
++CONFIG_SCHED_HRTICK=y
++CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
++CONFIG_ARCH_SPARSEMEM_ENABLE=y
++CONFIG_ARCH_SPARSEMEM_DEFAULT=y
++CONFIG_ARCH_SELECT_MEMORY_MODEL=y
++CONFIG_ARCH_FLATMEM_ENABLE=y
++CONFIG_HAVE_ARCH_PFN_VALID=y
++CONFIG_HW_PERF_EVENTS=y
++CONFIG_SYS_SUPPORTS_HUGETLBFS=y
++CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
++CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
++CONFIG_ARCH_LLC_128_LINE_SIZE=y
++CONFIG_ARCH_HAS_FILTER_PGPROT=y
++CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
++CONFIG_CC_HAVE_SHADOW_CALL_STACK=y
++# CONFIG_PARAVIRT is not set
++# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
++# CONFIG_KEXEC is not set
++# CONFIG_KEXEC_FILE is not set
++# CONFIG_CRASH_DUMP is not set
++# CONFIG_XEN is not set
++CONFIG_FORCE_MAX_ZONEORDER=11
++CONFIG_UNMAP_KERNEL_AT_EL0=y
++CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y
++CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
++# CONFIG_ARM64_PMEM_LEGACY is not set
++# CONFIG_ARM64_SW_TTBR0_PAN is not set
++CONFIG_ARM64_TAGGED_ADDR_ABI=y
++# CONFIG_AARCH32_EL0 is not set
++
++#
++# ARMv8.1 architectural features
++#
++CONFIG_ARM64_HW_AFDBM=y
++CONFIG_ARM64_PAN=y
++CONFIG_AS_HAS_LSE_ATOMICS=y
++CONFIG_ARM64_VHE=y
++# end of ARMv8.1 architectural features
++
++#
++# ARMv8.2 architectural features
++#
++# CONFIG_ARM64_PMEM is not set
++CONFIG_ARM64_RAS_EXTN=y
++CONFIG_ARM64_CNP=y
++# end of ARMv8.2 architectural features
++
++#
++# ARMv8.3 architectural features
++#
++CONFIG_ARM64_PTR_AUTH=y
++CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y
++CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y
++CONFIG_AS_HAS_PAC=y
++CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y
++# end of ARMv8.3 architectural features
++
++#
++# ARMv8.4 architectural features
++#
++CONFIG_ARM64_AMU_EXTN=y
++CONFIG_AS_HAS_ARMV8_4=y
++CONFIG_ARM64_TLB_RANGE=y
++# end of ARMv8.4 architectural features
++
++#
++# ARMv8.5 architectural features
++#
++# CONFIG_ARM64_BTI is not set
++CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y
++CONFIG_ARM64_E0PD=y
++CONFIG_ARCH_RANDOM=y
++CONFIG_ARM64_AS_HAS_MTE=y
++# CONFIG_ARM64_MTE is not set
++# end of ARMv8.5 architectural features
++
++#
++# ARMv8.6 architectural features
++#
++CONFIG_ARM64_TWED=y
++# end of ARMv8.6 architectural features
++
++#
++# ARMv8.7 architectural features
++#
++CONFIG_ARM64_EPAN=y
++# end of ARMv8.7 architectural features
++
++CONFIG_ARM64_SVE=y
++CONFIG_ARM64_MODULE_PLTS=y
++# CONFIG_ARM64_PSEUDO_NMI is not set
++CONFIG_RELOCATABLE=y
++# CONFIG_RANDOMIZE_BASE is not set
++CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y
++CONFIG_STACKPROTECTOR_PER_TASK=y
++# CONFIG_ASCEND_FEATURES is not set
++# end of Kernel Features
++
++#
++# Boot options
++#
++CONFIG_CMDLINE="mem=128M console=ttyAMA0,115200 console=ttyMTD,blackbox"
++# CONFIG_CMDLINE_FORCE is not set
++# CONFIG_EFI is not set
++# end of Boot options
++
++#
++# Power management options
++#
++CONFIG_SUSPEND=y
++CONFIG_SUSPEND_FREEZER=y
++# CONFIG_SUSPEND_SKIP_SYNC is not set
++CONFIG_PM_SLEEP=y
++CONFIG_PM_SLEEP_SMP=y
++# CONFIG_PM_AUTOSLEEP is not set
++# CONFIG_PM_WAKELOCKS is not set
++CONFIG_PM=y
++# CONFIG_PM_DEBUG is not set
++CONFIG_PM_CLK=y
++# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
++CONFIG_CPU_PM=y
++# CONFIG_ENERGY_MODEL is not set
++CONFIG_ARCH_HIBERNATION_POSSIBLE=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++# end of Power management options
++
++#
++# CPU Power Management
++#
++
++#
++# CPU Idle
++#
++# CONFIG_CPU_IDLE is not set
++# end of CPU Idle
++
++#
++# CPU Frequency scaling
++#
++CONFIG_CPU_FREQ=y
++CONFIG_CPU_FREQ_GOV_ATTR_SET=y
++CONFIG_CPU_FREQ_GOV_COMMON=y
++CONFIG_CPU_FREQ_STAT=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
++CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
++CONFIG_CPU_FREQ_GOV_POWERSAVE=y
++CONFIG_CPU_FREQ_GOV_USERSPACE=y
++CONFIG_CPU_FREQ_GOV_ONDEMAND=y
++CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
++# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set
++
++#
++# CPU frequency scaling drivers
++#
++CONFIG_CPUFREQ_DT=y
++CONFIG_CPUFREQ_DT_PLATDEV=y
++# end of CPU Frequency scaling
++# end of CPU Power Management
++
++#
++# Firmware Drivers
++#
++# CONFIG_ARM_SCMI_PROTOCOL is not set
++# CONFIG_ARM_SDE_INTERFACE is not set
++# CONFIG_FIRMWARE_MEMMAP is not set
++# CONFIG_FW_CFG_SYSFS is not set
++# CONFIG_GOOGLE_FIRMWARE is not set
++CONFIG_ARM_PSCI_FW=y
++CONFIG_HAVE_ARM_SMCCC=y
++CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y
++CONFIG_ARM_SMCCC_SOC_ID=y
++
++#
++# Tegra firmware driver
++#
++# end of Tegra firmware driver
++# end of Firmware Drivers
++
++# CONFIG_VIRTUALIZATION is not set
++# CONFIG_ARM64_CRYPTO is not set
++
++#
++# General architecture-dependent options
++#
++# CONFIG_KPROBES is not set
++# CONFIG_JUMP_LABEL is not set
++CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y
++CONFIG_HAVE_NMI=y
++CONFIG_HAVE_ARCH_TRACEHOOK=y
++CONFIG_HAVE_DMA_CONTIGUOUS=y
++CONFIG_GENERIC_SMP_IDLE_THREAD=y
++CONFIG_GENERIC_IDLE_POLL_SETUP=y
++CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
++CONFIG_ARCH_HAS_KEEPINITRD=y
++CONFIG_ARCH_HAS_SET_MEMORY=y
++CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
++CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
++CONFIG_HAVE_ASM_MODVERSIONS=y
++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
++CONFIG_HAVE_RSEQ=y
++CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
++CONFIG_HAVE_HW_BREAKPOINT=y
++CONFIG_HAVE_PERF_REGS=y
++CONFIG_HAVE_PERF_USER_STACK_DUMP=y
++CONFIG_HAVE_ARCH_JUMP_LABEL=y
++CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
++CONFIG_MMU_GATHER_TABLE_FREE=y
++CONFIG_MMU_GATHER_RCU_TABLE_FREE=y
++CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
++CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
++CONFIG_HAVE_CMPXCHG_LOCAL=y
++CONFIG_HAVE_CMPXCHG_DOUBLE=y
++CONFIG_HAVE_ARCH_SECCOMP=y
++CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
++# CONFIG_SECCOMP is not set
++CONFIG_HAVE_ARCH_STACKLEAK=y
++CONFIG_HAVE_STACKPROTECTOR=y
++CONFIG_STACKPROTECTOR=y
++CONFIG_STACKPROTECTOR_STRONG=y
++CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y
++CONFIG_HAVE_CONTEXT_TRACKING=y
++CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
++CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
++CONFIG_HAVE_MOVE_PUD=y
++CONFIG_HAVE_MOVE_PMD=y
++CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
++CONFIG_HAVE_ARCH_HUGE_VMAP=y
++CONFIG_HAVE_ARCH_HUGE_VMALLOC=y
++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
++CONFIG_MODULES_USE_ELF_RELA=y
++CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
++CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
++CONFIG_ARCH_MMAP_RND_BITS=18
++CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y
++CONFIG_CLONE_BACKWARDS=y
++CONFIG_COMPAT_32BIT_TIME=y
++CONFIG_HAVE_ARCH_VMAP_STACK=y
++CONFIG_VMAP_STACK=y
++CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y
++CONFIG_RANDOMIZE_KSTACK_OFFSET=y
++# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set
++CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
++CONFIG_STRICT_KERNEL_RWX=y
++CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
++CONFIG_STRICT_MODULE_RWX=y
++CONFIG_HAVE_ARCH_COMPILER_H=y
++CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y
++# CONFIG_LOCK_EVENT_COUNTS is not set
++CONFIG_ARCH_HAS_RELR=y
++CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y
++
++#
++# GCOV-based kernel profiling
++#
++# CONFIG_GCOV_KERNEL is not set
++CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
++# end of GCOV-based kernel profiling
++
++CONFIG_HAVE_GCC_PLUGINS=y
++CONFIG_GCC_PLUGINS=y
++# CONFIG_GCC_PLUGIN_CYC_COMPLEXITY is not set
++# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set
++# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set
++# end of General architecture-dependent options
++
++CONFIG_RT_MUTEXES=y
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_FORCE_LOAD=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++# CONFIG_MODULE_SIG is not set
++# CONFIG_MODULE_COMPRESS is not set
++# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_TRIM_UNUSED_KSYMS is not set
++CONFIG_MODULES_TREE_LOOKUP=y
++CONFIG_BLOCK=y
++CONFIG_BLK_SCSI_REQUEST=y
++CONFIG_BLK_DEV_BSG=y
++# CONFIG_BLK_DEV_BSGLIB is not set
++# CONFIG_BLK_DEV_INTEGRITY is not set
++# CONFIG_BLK_DEV_ZONED is not set
++# CONFIG_BLK_DEV_THROTTLING is not set
++CONFIG_BLK_CMDLINE_PARSER=y
++# CONFIG_BLK_WBT is not set
++# CONFIG_BLK_CGROUP_IOLATENCY is not set
++# CONFIG_BLK_CGROUP_IOCOST is not set
++CONFIG_BLK_DEBUG_FS=y
++# CONFIG_BLK_SED_OPAL is not set
++# CONFIG_BLK_INLINE_ENCRYPTION is not set
++# CONFIG_BLK_DEV_DUMPINFO is not set
++
++#
++# Partition Types
++#
++CONFIG_PARTITION_ADVANCED=y
++# CONFIG_ACORN_PARTITION is not set
++# CONFIG_AIX_PARTITION is not set
++# CONFIG_OSF_PARTITION is not set
++# CONFIG_AMIGA_PARTITION is not set
++# CONFIG_ATARI_PARTITION is not set
++# CONFIG_MAC_PARTITION is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_BSD_DISKLABEL is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# CONFIG_UNIXWARE_DISKLABEL is not set
++# CONFIG_LDM_PARTITION is not set
++# CONFIG_SGI_PARTITION is not set
++# CONFIG_ULTRIX_PARTITION is not set
++# CONFIG_SUN_PARTITION is not set
++# CONFIG_KARMA_PARTITION is not set
++CONFIG_EFI_PARTITION=y
++# CONFIG_SYSV68_PARTITION is not set
++CONFIG_CMDLINE_PARTITION=y
++# end of Partition Types
++
++CONFIG_BLK_MQ_PCI=y
++CONFIG_BLK_PM=y
++
++#
++# IO Schedulers
++#
++CONFIG_MQ_IOSCHED_DEADLINE=y
++CONFIG_MQ_IOSCHED_KYBER=y
++# CONFIG_IOSCHED_BFQ is not set
++# end of IO Schedulers
++
++CONFIG_ASN1=y
++CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y
++CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_LOCK=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_INLINE_READ_LOCK=y
++CONFIG_ARCH_INLINE_READ_LOCK_BH=y
++CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_READ_UNLOCK=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_INLINE_WRITE_LOCK=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_SPIN_TRYLOCK=y
++CONFIG_INLINE_SPIN_TRYLOCK_BH=y
++CONFIG_INLINE_SPIN_LOCK=y
++CONFIG_INLINE_SPIN_LOCK_BH=y
++CONFIG_INLINE_SPIN_LOCK_IRQ=y
++CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y
++CONFIG_INLINE_SPIN_UNLOCK_BH=y
++CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
++CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_READ_LOCK=y
++CONFIG_INLINE_READ_LOCK_BH=y
++CONFIG_INLINE_READ_LOCK_IRQ=y
++CONFIG_INLINE_READ_LOCK_IRQSAVE=y
++CONFIG_INLINE_READ_UNLOCK=y
++CONFIG_INLINE_READ_UNLOCK_BH=y
++CONFIG_INLINE_READ_UNLOCK_IRQ=y
++CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_WRITE_LOCK=y
++CONFIG_INLINE_WRITE_LOCK_BH=y
++CONFIG_INLINE_WRITE_LOCK_IRQ=y
++CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y
++CONFIG_INLINE_WRITE_UNLOCK=y
++CONFIG_INLINE_WRITE_UNLOCK_BH=y
++CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
++CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
++CONFIG_MUTEX_SPIN_ON_OWNER=y
++CONFIG_RWSEM_SPIN_ON_OWNER=y
++CONFIG_LOCK_SPIN_ON_OWNER=y
++CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
++CONFIG_QUEUED_SPINLOCKS=y
++CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
++CONFIG_QUEUED_RWLOCKS=y
++CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y
++CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y
++CONFIG_FREEZER=y
++
++#
++# Executable file formats
++#
++CONFIG_BINFMT_ELF=y
++CONFIG_ARCH_BINFMT_ELF_STATE=y
++CONFIG_ARCH_HAVE_ELF_PROT=y
++CONFIG_ARCH_USE_GNU_PROPERTY=y
++CONFIG_ELFCORE=y
++CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
++CONFIG_BINFMT_SCRIPT=y
++# CONFIG_BINFMT_MISC is not set
++CONFIG_COREDUMP=y
++# end of Executable file formats
++
++#
++# Memory Management options
++#
++CONFIG_SELECT_MEMORY_MODEL=y
++# CONFIG_FLATMEM_MANUAL is not set
++CONFIG_SPARSEMEM_MANUAL=y
++CONFIG_SPARSEMEM=y
++CONFIG_SPARSEMEM_EXTREME=y
++CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
++CONFIG_SPARSEMEM_VMEMMAP=y
++CONFIG_HAVE_FAST_GUP=y
++CONFIG_HOLES_IN_ZONE=y
++CONFIG_ARCH_KEEP_MEMBLOCK=y
++CONFIG_MEMORY_ISOLATION=y
++# CONFIG_MEMORY_HOTPLUG is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++CONFIG_COMPACTION=y
++# CONFIG_PAGE_REPORTING is not set
++CONFIG_MIGRATION=y
++# CONFIG_HUGE_VMALLOC_DEFAULT_ENABLED is not set
++CONFIG_CONTIG_ALLOC=y
++CONFIG_PHYS_ADDR_T_64BIT=y
++CONFIG_BOUNCE=y
++CONFIG_MMU_NOTIFIER=y
++CONFIG_KSM=y
++CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
++CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
++# CONFIG_MEMORY_FAILURE is not set
++# CONFIG_TRANSPARENT_HUGEPAGE is not set
++# CONFIG_CLEANCACHE is not set
++CONFIG_MEMCG_QOS=y
++# CONFIG_ETMEM is not set
++# CONFIG_USERSWAP is not set
++# CONFIG_PAGE_CACHE_LIMIT is not set
++CONFIG_CMA=y
++# CONFIG_CMA_DEBUG is not set
++# CONFIG_CMA_DEBUGFS is not set
++CONFIG_CMA_AREAS=7
++# CONFIG_ZPOOL is not set
++# CONFIG_ZBUD is not set
++# CONFIG_ZSMALLOC is not set
++CONFIG_GENERIC_EARLY_IOREMAP=y
++# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
++# CONFIG_IDLE_PAGE_TRACKING is not set
++CONFIG_ARCH_HAS_PTE_DEVMAP=y
++CONFIG_FRAME_VECTOR=y
++# CONFIG_PERCPU_STATS is not set
++# CONFIG_GUP_BENCHMARK is not set
++CONFIG_ARCH_HAS_PTE_SPECIAL=y
++# CONFIG_PIN_MEMORY is not set
++# CONFIG_CLEAR_FREELIST_PAGE is not set
++# CONFIG_EXTEND_HUGEPAGE_MAPPING is not set
++
++#
++# Data Access Monitoring
++#
++# CONFIG_DAMON is not set
++# end of Data Access Monitoring
++# end of Memory Management options
++
++CONFIG_NET=y
++CONFIG_NET_INGRESS=y
++CONFIG_SKB_EXTENSIONS=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_DIAG is not set
++CONFIG_UNIX=y
++CONFIG_UNIX_SCM=y
++# CONFIG_UNIX_DIAG is not set
++# CONFIG_TLS is not set
++CONFIG_XFRM=y
++CONFIG_XFRM_ALGO=m
++CONFIG_XFRM_USER=m
++# CONFIG_XFRM_INTERFACE is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
++# CONFIG_NET_KEY is not set
++# CONFIG_XDP_SOCKETS is not set
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=y
++# CONFIG_IP_ADVANCED_ROUTER is not set
++# CONFIG_IP_PNP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE_DEMUX is not set
++CONFIG_NET_IP_TUNNEL=m
++# CONFIG_IP_MROUTE is not set
++# CONFIG_SYN_COOKIES is not set
++# CONFIG_NET_IPVTI is not set
++CONFIG_NET_UDP_TUNNEL=m
++# CONFIG_NET_FOU is not set
++# CONFIG_NET_FOU_IP_TUNNELS is not set
++# 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=m
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_INET_UDP_DIAG is not set
++# CONFIG_INET_RAW_DIAG is not set
++# CONFIG_INET_DIAG_DESTROY is not set
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++CONFIG_IPV6=y
++CONFIG_IPV6_ROUTER_PREF=y
++# CONFIG_IPV6_ROUTE_INFO is not set
++# CONFIG_IPV6_OPTIMISTIC_DAD is not set
++# CONFIG_INET6_AH is not set
++# CONFIG_INET6_ESP is not set
++# CONFIG_INET6_IPCOMP is not set
++# CONFIG_IPV6_MIP6 is not set
++# CONFIG_IPV6_ILA is not set
++# CONFIG_IPV6_VTI is not set
++CONFIG_IPV6_SIT=m
++# CONFIG_IPV6_SIT_6RD is not set
++CONFIG_IPV6_NDISC_NODETYPE=y
++# CONFIG_IPV6_TUNNEL is not set
++# CONFIG_IPV6_MULTIPLE_TABLES is not set
++# CONFIG_IPV6_MROUTE is not set
++# CONFIG_IPV6_SEG6_LWTUNNEL is not set
++# CONFIG_IPV6_SEG6_HMAC is not set
++# CONFIG_IPV6_RPL_LWTUNNEL is not set
++# CONFIG_MPTCP is not set
++# CONFIG_NETWORK_SECMARK is not set
++# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
++CONFIG_NETFILTER=y
++CONFIG_NETFILTER_ADVANCED=y
++CONFIG_BRIDGE_NETFILTER=m
++
++#
++# Core Netfilter Configuration
++#
++CONFIG_NETFILTER_INGRESS=y
++CONFIG_NETFILTER_NETLINK=m
++CONFIG_NETFILTER_FAMILY_BRIDGE=y
++# CONFIG_NETFILTER_NETLINK_ACCT is not set
++# CONFIG_NETFILTER_NETLINK_QUEUE is not set
++CONFIG_NETFILTER_NETLINK_LOG=m
++# CONFIG_NETFILTER_NETLINK_OSF is not set
++CONFIG_NF_CONNTRACK=m
++# CONFIG_NF_LOG_NETDEV is not set
++CONFIG_NF_CONNTRACK_MARK=y
++# CONFIG_NF_CONNTRACK_ZONES is not set
++# CONFIG_NF_CONNTRACK_PROCFS is not set
++CONFIG_NF_CONNTRACK_EVENTS=y
++# CONFIG_NF_CONNTRACK_TIMEOUT is not set
++# CONFIG_NF_CONNTRACK_TIMESTAMP is not set
++# CONFIG_NF_CONNTRACK_LABELS is not set
++CONFIG_NF_CT_PROTO_DCCP=y
++CONFIG_NF_CT_PROTO_SCTP=y
++CONFIG_NF_CT_PROTO_UDPLITE=y
++# CONFIG_NF_CONNTRACK_AMANDA is not set
++CONFIG_NF_CONNTRACK_FTP=m
++# CONFIG_NF_CONNTRACK_H323 is not set
++# CONFIG_NF_CONNTRACK_IRC is not set
++# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
++# CONFIG_NF_CONNTRACK_SNMP is not set
++# CONFIG_NF_CONNTRACK_PPTP is not set
++# CONFIG_NF_CONNTRACK_SANE is not set
++# CONFIG_NF_CONNTRACK_SIP is not set
++CONFIG_NF_CONNTRACK_TFTP=m
++CONFIG_NF_CT_NETLINK=m
++CONFIG_NETFILTER_NETLINK_GLUE_CT=y
++CONFIG_NF_NAT=m
++CONFIG_NF_NAT_FTP=m
++CONFIG_NF_NAT_TFTP=m
++CONFIG_NF_NAT_MASQUERADE=y
++CONFIG_NF_TABLES=m
++# CONFIG_NF_TABLES_INET is not set
++# CONFIG_NF_TABLES_NETDEV is not set
++# CONFIG_NFT_NUMGEN is not set
++# CONFIG_NFT_CT is not set
++CONFIG_NFT_COUNTER=m
++# CONFIG_NFT_CONNLIMIT is not set
++# CONFIG_NFT_LOG is not set
++# CONFIG_NFT_LIMIT is not set
++# CONFIG_NFT_MASQ is not set
++# CONFIG_NFT_REDIR is not set
++CONFIG_NFT_NAT=m
++# CONFIG_NFT_TUNNEL is not set
++# CONFIG_NFT_OBJREF is not set
++# CONFIG_NFT_QUOTA is not set
++# CONFIG_NFT_REJECT is not set
++CONFIG_NFT_COMPAT=m
++# CONFIG_NFT_HASH is not set
++# CONFIG_NFT_XFRM is not set
++# CONFIG_NFT_SOCKET is not set
++# CONFIG_NFT_OSF is not set
++# CONFIG_NFT_TPROXY is not set
++# CONFIG_NFT_SYNPROXY is not set
++# CONFIG_NF_FLOW_TABLE is not set
++CONFIG_NETFILTER_XTABLES=m
++
++#
++# Xtables combined modules
++#
++CONFIG_NETFILTER_XT_MARK=m
++CONFIG_NETFILTER_XT_CONNMARK=m
++
++#
++# Xtables targets
++#
++# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
++# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
++# CONFIG_NETFILTER_XT_TARGET_HMARK is not set
++# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set
++# CONFIG_NETFILTER_XT_TARGET_LOG is not set
++CONFIG_NETFILTER_XT_TARGET_MARK=m
++CONFIG_NETFILTER_XT_NAT=m
++# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set
++CONFIG_NETFILTER_XT_TARGET_NFLOG=m
++# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
++# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
++# CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set
++CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m
++# CONFIG_NETFILTER_XT_TARGET_TEE is not set
++# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
++
++#
++# Xtables matches
++#
++CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
++# CONFIG_NETFILTER_XT_MATCH_BPF is not set
++# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set
++# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set
++CONFIG_NETFILTER_XT_MATCH_COMMENT=m
++# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
++# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set
++# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
++# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
++CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
++# CONFIG_NETFILTER_XT_MATCH_CPU is not set
++# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
++# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set
++# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
++# CONFIG_NETFILTER_XT_MATCH_ECN is not set
++# CONFIG_NETFILTER_XT_MATCH_ESP is not set
++# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
++# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
++# CONFIG_NETFILTER_XT_MATCH_HL is not set
++# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set
++# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
++CONFIG_NETFILTER_XT_MATCH_IPVS=m
++# CONFIG_NETFILTER_XT_MATCH_L2TP is not set
++# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
++CONFIG_NETFILTER_XT_MATCH_LIMIT=m
++# CONFIG_NETFILTER_XT_MATCH_MAC is not set
++# CONFIG_NETFILTER_XT_MATCH_MARK is not set
++CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
++# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set
++# CONFIG_NETFILTER_XT_MATCH_OSF is not set
++# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
++# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
++CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
++# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
++# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
++# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
++# CONFIG_NETFILTER_XT_MATCH_REALM is not set
++CONFIG_NETFILTER_XT_MATCH_RECENT=m
++# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
++# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set
++# CONFIG_NETFILTER_XT_MATCH_STATE is not set
++CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
++# CONFIG_NETFILTER_XT_MATCH_STRING is not set
++# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
++# CONFIG_NETFILTER_XT_MATCH_TIME is not set
++# CONFIG_NETFILTER_XT_MATCH_U32 is not set
++# end of Core Netfilter Configuration
++
++# CONFIG_IP_SET is not set
++CONFIG_IP_VS=m
++# CONFIG_IP_VS_IPV6 is not set
++# CONFIG_IP_VS_DEBUG is not set
++CONFIG_IP_VS_TAB_BITS=12
++
++#
++# IPVS transport protocol load balancing support
++#
++# CONFIG_IP_VS_PROTO_TCP is not set
++# CONFIG_IP_VS_PROTO_UDP is not set
++# CONFIG_IP_VS_PROTO_ESP is not set
++# CONFIG_IP_VS_PROTO_AH is not set
++# CONFIG_IP_VS_PROTO_SCTP is not set
++
++#
++# IPVS scheduler
++#
++CONFIG_IP_VS_RR=m
++CONFIG_IP_VS_WRR=m
++# CONFIG_IP_VS_LC is not set
++# CONFIG_IP_VS_WLC is not set
++# CONFIG_IP_VS_FO is not set
++# CONFIG_IP_VS_OVF is not set
++# CONFIG_IP_VS_LBLC is not set
++# CONFIG_IP_VS_LBLCR is not set
++# CONFIG_IP_VS_DH is not set
++CONFIG_IP_VS_SH=m
++# CONFIG_IP_VS_MH is not set
++# CONFIG_IP_VS_SED is not set
++# CONFIG_IP_VS_NQ is not set
++
++#
++# IPVS SH scheduler
++#
++CONFIG_IP_VS_SH_TAB_BITS=8
++
++#
++# IPVS MH scheduler
++#
++CONFIG_IP_VS_MH_TAB_INDEX=12
++
++#
++# IPVS application helper
++#
++# CONFIG_IP_VS_NFCT is not set
++
++#
++# IP: Netfilter Configuration
++#
++CONFIG_NF_DEFRAG_IPV4=m
++# CONFIG_NF_SOCKET_IPV4 is not set
++# CONFIG_NF_TPROXY_IPV4 is not set
++CONFIG_NF_TABLES_IPV4=y
++# CONFIG_NFT_DUP_IPV4 is not set
++# CONFIG_NFT_FIB_IPV4 is not set
++# CONFIG_NF_TABLES_ARP is not set
++# CONFIG_NF_DUP_IPV4 is not set
++# CONFIG_NF_LOG_ARP is not set
++# CONFIG_NF_LOG_IPV4 is not set
++# CONFIG_NF_REJECT_IPV4 is not set
++CONFIG_IP_NF_IPTABLES=m
++# CONFIG_IP_NF_MATCH_AH is not set
++# CONFIG_IP_NF_MATCH_ECN is not set
++# CONFIG_IP_NF_MATCH_TTL is not set
++# CONFIG_IP_NF_FILTER is not set
++# CONFIG_IP_NF_TARGET_SYNPROXY is not set
++CONFIG_IP_NF_NAT=m
++# CONFIG_IP_NF_TARGET_MASQUERADE is not set
++# CONFIG_IP_NF_TARGET_NETMAP is not set
++# CONFIG_IP_NF_TARGET_REDIRECT is not set
++# CONFIG_IP_NF_MANGLE is not set
++# CONFIG_IP_NF_RAW is not set
++# CONFIG_IP_NF_ARPTABLES is not set
++# end of IP: Netfilter Configuration
++
++#
++# IPv6: Netfilter Configuration
++#
++# CONFIG_NF_SOCKET_IPV6 is not set
++# CONFIG_NF_TPROXY_IPV6 is not set
++CONFIG_NF_TABLES_IPV6=y
++# CONFIG_NFT_DUP_IPV6 is not set
++# CONFIG_NFT_FIB_IPV6 is not set
++# CONFIG_NF_DUP_IPV6 is not set
++# CONFIG_NF_REJECT_IPV6 is not set
++# CONFIG_NF_LOG_IPV6 is not set
++# CONFIG_IP6_NF_IPTABLES is not set
++# end of IPv6: Netfilter Configuration
++
++CONFIG_NF_DEFRAG_IPV6=m
++# CONFIG_NF_TABLES_BRIDGE is not set
++# CONFIG_NF_CONNTRACK_BRIDGE is not set
++# CONFIG_BRIDGE_NF_EBTABLES is not set
++# CONFIG_BPFILTER is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_RDS is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_L2TP is not set
++CONFIG_STP=m
++CONFIG_BRIDGE=m
++CONFIG_BRIDGE_IGMP_SNOOPING=y
++# CONFIG_BRIDGE_MRP is not set
++CONFIG_HAVE_NET_DSA=y
++# CONFIG_NET_DSA is not set
++# CONFIG_VLAN_8021Q is not set
++CONFIG_LLC=m
++# CONFIG_LLC2 is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_PHONET is not set
++# CONFIG_6LOWPAN is not set
++# CONFIG_IEEE802154 is not set
++# CONFIG_NET_SCHED is not set
++# CONFIG_DCB is not set
++# CONFIG_DNS_RESOLVER is not set
++# CONFIG_BATMAN_ADV is not set
++# CONFIG_OPENVSWITCH is not set
++# CONFIG_VSOCKETS is not set
++CONFIG_NETLINK_DIAG=m
++# CONFIG_MPLS is not set
++# CONFIG_NET_NSH is not set
++# CONFIG_HSR is not set
++# CONFIG_NET_SWITCHDEV is not set
++CONFIG_NET_L3_MASTER_DEV=y
++# CONFIG_QRTR is not set
++# CONFIG_NET_NCSI is not set
++CONFIG_RPS=y
++CONFIG_RFS_ACCEL=y
++CONFIG_XPS=y
++# CONFIG_CGROUP_NET_PRIO is not set
++# CONFIG_CGROUP_NET_CLASSID is not set
++CONFIG_NET_RX_BUSY_POLL=y
++CONFIG_BQL=y
++# CONFIG_BPF_JIT is not set
++# CONFIG_BPF_STREAM_PARSER is not set
++CONFIG_NET_FLOW_LIMIT=y
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# end of Network testing
++# end of Networking options
++
++# CONFIG_HAMRADIO is not set
++CONFIG_CAN=y
++CONFIG_CAN_RAW=y
++CONFIG_CAN_BCM=y
++CONFIG_CAN_GW=y
++# CONFIG_CAN_J1939 is not set
++# CONFIG_CAN_ISOTP is not set
++
++#
++# CAN Device Drivers
++#
++# CONFIG_CAN_VCAN is not set
++# CONFIG_CAN_VXCAN is not set
++# CONFIG_CAN_SLCAN is not set
++CONFIG_CAN_DEV=y
++CONFIG_CAN_CALC_BITTIMING=y
++# CONFIG_CAN_FLEXCAN is not set
++# CONFIG_CAN_GRCAN is not set
++# CONFIG_CAN_KVASER_PCIEFD is not set
++# CONFIG_CAN_XILINXCAN is not set
++# CONFIG_CAN_C_CAN is not set
++# CONFIG_CAN_CC770 is not set
++# CONFIG_CAN_IFI_CANFD is not set
++# CONFIG_CAN_M_CAN is not set
++# CONFIG_CAN_PEAK_PCIEFD is not set
++# CONFIG_CAN_SJA1000 is not set
++# CONFIG_CAN_SOFTING is not set
++
++#
++# CAN SPI interfaces
++#
++# CONFIG_CAN_HI311X is not set
++CONFIG_CAN_MCP251X=y
++# CONFIG_CAN_MCP251XFD is not set
++# end of CAN SPI interfaces
++
++#
++# CAN USB interfaces
++#
++# CONFIG_CAN_8DEV_USB is not set
++# CONFIG_CAN_EMS_USB is not set
++# CONFIG_CAN_ESD_USB2 is not set
++# CONFIG_CAN_GS_USB is not set
++# CONFIG_CAN_KVASER_USB is not set
++# CONFIG_CAN_MCBA_USB is not set
++# CONFIG_CAN_PEAK_USB is not set
++# CONFIG_CAN_UCAN is not set
++# end of CAN USB interfaces
++
++# CONFIG_CAN_DEBUG_DEVICES is not set
++# end of CAN Device Drivers
++
++CONFIG_BT=y
++CONFIG_BT_BREDR=y
++# CONFIG_BT_RFCOMM is not set
++# CONFIG_BT_BNEP is not set
++# CONFIG_BT_HIDP is not set
++# CONFIG_BT_HS is not set
++CONFIG_BT_LE=y
++# CONFIG_BT_MSFTEXT is not set
++CONFIG_BT_DEBUGFS=y
++# CONFIG_BT_SELFTEST is not set
++# CONFIG_BT_FEATURE_DEBUG is not set
++
++#
++# Bluetooth device drivers
++#
++# CONFIG_BT_HCIBTUSB is not set
++# CONFIG_BT_HCIBTSDIO is not set
++# CONFIG_BT_HCIUART is not set
++# CONFIG_BT_HCIBCM203X is not set
++# CONFIG_BT_HCIBPA10X is not set
++# CONFIG_BT_HCIBFUSB is not set
++# CONFIG_BT_HCIVHCI is not set
++# CONFIG_BT_MRVL is not set
++# CONFIG_BT_MTKSDIO is not set
++# end of Bluetooth device drivers
++
++# CONFIG_AF_RXRPC is not set
++# CONFIG_AF_KCM is not set
++CONFIG_WIRELESS=y
++CONFIG_WEXT_CORE=y
++CONFIG_WEXT_PROC=y
++CONFIG_CFG80211=y
++# CONFIG_NL80211_TESTMODE is not set
++# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
++# CONFIG_CFG80211_CERTIFICATION_ONUS is not set
++CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y
++CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y
++CONFIG_CFG80211_DEFAULT_PS=y
++# CONFIG_CFG80211_DEBUGFS is not set
++CONFIG_CFG80211_CRDA_SUPPORT=y
++CONFIG_CFG80211_WEXT=y
++CONFIG_MAC80211=y
++CONFIG_MAC80211_HAS_RC=y
++CONFIG_MAC80211_RC_MINSTREL=y
++CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
++CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
++# CONFIG_MAC80211_MESH is not set
++# CONFIG_MAC80211_DEBUGFS is not set
++# CONFIG_MAC80211_MESSAGE_TRACING is not set
++# CONFIG_MAC80211_DEBUG_MENU is not set
++CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
++# CONFIG_WIMAX is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++# CONFIG_CAIF is not set
++# CONFIG_CEPH_LIB is not set
++# CONFIG_NFC is not set
++# CONFIG_PSAMPLE is not set
++# CONFIG_NET_IFE is not set
++# CONFIG_LWTUNNEL is not set
++CONFIG_DST_CACHE=y
++CONFIG_GRO_CELLS=y
++# CONFIG_FAILOVER is not set
++CONFIG_ETHTOOL_NETLINK=y
++CONFIG_HAVE_EBPF_JIT=y
++
++#
++# Device Drivers
++#
++CONFIG_ARM_AMBA=y
++CONFIG_HAVE_PCI=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_DOMAINS_GENERIC=y
++CONFIG_PCI_SYSCALL=y
++CONFIG_PCIEPORTBUS=y
++# CONFIG_PCIEAER is not set
++# CONFIG_PCIEASPM is not set
++CONFIG_PCIE_PME=y
++# CONFIG_PCIE_PTM is not set
++CONFIG_PCI_MSI=y
++CONFIG_PCI_MSI_IRQ_DOMAIN=y
++CONFIG_PCI_QUIRKS=y
++# CONFIG_PCI_DEBUG is not set
++# CONFIG_PCI_STUB is not set
++# CONFIG_PCI_IOV is not set
++# CONFIG_PCI_PRI is not set
++# CONFIG_PCI_PASID is not set
++# CONFIG_PCIE_BUS_TUNE_OFF is not set
++CONFIG_PCIE_BUS_DEFAULT=y
++# CONFIG_PCIE_BUS_SAFE is not set
++# CONFIG_PCIE_BUS_PERFORMANCE is not set
++# CONFIG_PCIE_BUS_PEER2PEER is not set
++# CONFIG_HOTPLUG_PCI is not set
++
++#
++# PCI controller drivers
++#
++# CONFIG_PCI_FTPCI100 is not set
++# CONFIG_PCI_HOST_GENERIC is not set
++# CONFIG_PCIE_XILINX is not set
++# CONFIG_PCI_XGENE is not set
++# CONFIG_PCIE_ALTERA is not set
++# CONFIG_PCI_HOST_THUNDER_PEM is not set
++# CONFIG_PCI_HOST_THUNDER_ECAM is not set
++
++#
++# DesignWare PCI Core Support
++#
++# CONFIG_PCIE_DW_PLAT_HOST is not set
++# CONFIG_PCI_HISI is not set
++# CONFIG_PCIE_KIRIN is not set
++# CONFIG_PCI_MESON is not set
++# CONFIG_PCIE_AL is not set
++# end of DesignWare PCI Core Support
++
++#
++# Mobiveil PCIe Core Support
++#
++# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set
++# end of Mobiveil PCIe Core Support
++
++#
++# Cadence PCIe controllers support
++#
++# CONFIG_PCIE_CADENCE_PLAT_HOST is not set
++# CONFIG_PCI_J721E_HOST is not set
++# end of Cadence PCIe controllers support
++# end of PCI controller drivers
++
++#
++# PCI Endpoint
++#
++# CONFIG_PCI_ENDPOINT is not set
++# end of PCI Endpoint
++
++#
++# PCI switch controller drivers
++#
++# CONFIG_PCI_SW_SWITCHTEC is not set
++# end of PCI switch controller drivers
++
++# CONFIG_PCCARD is not set
++# CONFIG_RAPIDIO is not set
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER=y
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_DEVTMPFS=y
++CONFIG_DEVTMPFS_MOUNT=y
++CONFIG_STANDALONE=y
++# CONFIG_PREVENT_FIRMWARE_BUILD is not set
++
++#
++# Firmware loader
++#
++CONFIG_FW_LOADER=y
++CONFIG_EXTRA_FIRMWARE=""
++# CONFIG_FW_LOADER_USER_HELPER is not set
++# CONFIG_FW_LOADER_COMPRESS is not set
++CONFIG_FW_CACHE=y
++# end of Firmware loader
++
++CONFIG_ALLOW_DEV_COREDUMP=y
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
++# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
++CONFIG_GENERIC_CPU_AUTOPROBE=y
++CONFIG_GENERIC_CPU_VULNERABILITIES=y
++CONFIG_SOC_BUS=y
++CONFIG_REGMAP=y
++CONFIG_REGMAP_MMIO=y
++CONFIG_DMA_SHARED_BUFFER=y
++# CONFIG_DMA_FENCE_TRACE is not set
++CONFIG_GENERIC_ARCH_TOPOLOGY=y
++# end of Generic Driver Options
++
++#
++# Bus devices
++#
++# CONFIG_BRCMSTB_GISB_ARB is not set
++# CONFIG_MOXTET is not set
++# CONFIG_SIMPLE_PM_BUS is not set
++# CONFIG_VEXPRESS_CONFIG is not set
++# CONFIG_MHI_BUS is not set
++# end of Bus devices
++
++# CONFIG_CONNECTOR is not set
++# CONFIG_GNSS is not set
++# CONFIG_MTD is not set
++CONFIG_DTC=y
++CONFIG_OF=y
++# CONFIG_OF_UNITTEST is not set
++CONFIG_OF_FLATTREE=y
++CONFIG_OF_EARLY_FLATTREE=y
++CONFIG_OF_KOBJ=y
++CONFIG_OF_ADDRESS=y
++CONFIG_OF_IRQ=y
++CONFIG_OF_NET=y
++CONFIG_OF_RESERVED_MEM=y
++# CONFIG_OF_OVERLAY is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_NULL_BLK is not set
++# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
++# CONFIG_BLK_DEV_UMEM is not set
++CONFIG_BLK_DEV_LOOP=y
++CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_DRBD is not set
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_SKD is not set
++# CONFIG_BLK_DEV_SX8 is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=65536
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++# CONFIG_BLK_DEV_RBD is not set
++# CONFIG_BLK_DEV_RSXX is not set
++
++#
++# NVME Support
++#
++# CONFIG_BLK_DEV_NVME is not set
++# CONFIG_NVME_FC is not set
++# CONFIG_NVME_TCP is not set
++# CONFIG_NVME_TARGET is not set
++# end of NVME Support
++
++#
++# Misc devices
++#
++# CONFIG_AD525X_DPOT is not set
++# CONFIG_DUMMY_IRQ is not set
++# CONFIG_PHANTOM is not set
++# CONFIG_TIFM_CORE is not set
++# CONFIG_ICS932S401 is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_HP_ILO is not set
++# CONFIG_APDS9802ALS is not set
++# CONFIG_ISL29003 is not set
++# CONFIG_ISL29020 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_SENSORS_BH1770 is not set
++# CONFIG_SENSORS_APDS990X is not set
++# CONFIG_HMC6352 is not set
++# CONFIG_DS1682 is not set
++# CONFIG_LATTICE_ECP3_CONFIG is not set
++# CONFIG_SRAM is not set
++# CONFIG_PCI_ENDPOINT_TEST is not set
++# CONFIG_XILINX_SDFEC is not set
++# CONFIG_PVPANIC is not set
++# CONFIG_C2PORT is not set
++
++#
++# EEPROM support
++#
++# CONFIG_EEPROM_AT24 is not set
++# CONFIG_EEPROM_AT25 is not set
++# CONFIG_EEPROM_LEGACY is not set
++# CONFIG_EEPROM_MAX6875 is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_EEPROM_93XX46 is not set
++# CONFIG_EEPROM_IDT_89HPESX is not set
++# CONFIG_EEPROM_EE1004 is not set
++# end of EEPROM support
++
++# CONFIG_CB710_CORE is not set
++
++#
++# Texas Instruments shared transport line discipline
++#
++# CONFIG_TI_ST is not set
++# end of Texas Instruments shared transport line discipline
++
++# CONFIG_SENSORS_LIS3_SPI is not set
++# CONFIG_SENSORS_LIS3_I2C is not set
++# CONFIG_ALTERA_STAPL is not set
++# CONFIG_GENWQE is not set
++# CONFIG_ECHO is not set
++# CONFIG_MISC_ALCOR_PCI is not set
++# CONFIG_MISC_RTSX_PCI is not set
++# CONFIG_MISC_RTSX_USB is not set
++# CONFIG_HABANA_AI is not set
++# CONFIG_UACCE is not set
++# end of Misc devices
++
++#
++# SCSI device support
++#
++CONFIG_SCSI_MOD=y
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_DMA=y
++CONFIG_SCSI_PROC_FS=y
++
++#
++# SCSI support type (disk, tape, CD-ROM)
++#
++CONFIG_BLK_DEV_SD=y
++# CONFIG_CHR_DEV_ST is not set
++# CONFIG_BLK_DEV_SR is not set
++# CONFIG_CHR_DEV_SG is not set
++# CONFIG_CHR_DEV_SCH is not set
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++# CONFIG_SCSI_SCAN_ASYNC is not set
++
++#
++# SCSI Transports
++#
++# CONFIG_SCSI_SPI_ATTRS is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++# CONFIG_SCSI_SRP_ATTRS is not set
++# end of SCSI Transports
++
++CONFIG_SCSI_LOWLEVEL=y
++# CONFIG_ISCSI_TCP is not set
++# CONFIG_ISCSI_BOOT_SYSFS is not set
++# CONFIG_SCSI_CXGB3_ISCSI is not set
++# CONFIG_SCSI_CXGB4_ISCSI is not set
++# CONFIG_SCSI_BNX2_ISCSI is not set
++# CONFIG_BE2ISCSI is not set
++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
++# CONFIG_SCSI_HPSA is not set
++# CONFIG_SCSI_3W_9XXX is not set
++# CONFIG_SCSI_3W_SAS is not set
++# CONFIG_SCSI_ACARD is not set
++# CONFIG_SCSI_AACRAID is not set
++# CONFIG_SCSI_AIC7XXX is not set
++# CONFIG_SCSI_AIC79XX is not set
++# CONFIG_SCSI_AIC94XX is not set
++# CONFIG_SCSI_MVSAS is not set
++# CONFIG_SCSI_MVUMI is not set
++# CONFIG_SCSI_ADVANSYS is not set
++# CONFIG_SCSI_ARCMSR is not set
++# CONFIG_SCSI_ESAS2R is not set
++# CONFIG_MEGARAID_NEWGEN is not set
++# CONFIG_MEGARAID_LEGACY is not set
++# CONFIG_MEGARAID_SAS is not set
++# CONFIG_SCSI_3SNIC_SSSRAID is not set
++# CONFIG_SCSI_MPT3SAS is not set
++# CONFIG_SCSI_MPT2SAS is not set
++# CONFIG_SCSI_SMARTPQI is not set
++# CONFIG_SCSI_UFSHCD is not set
++# CONFIG_SCSI_HPTIOP is not set
++# CONFIG_SCSI_MYRB is not set
++# CONFIG_SCSI_MYRS is not set
++# CONFIG_SCSI_SNIC is not set
++# CONFIG_SCSI_DMX3191D is not set
++# CONFIG_SCSI_FDOMAIN_PCI is not set
++# CONFIG_SCSI_GDTH is not set
++# CONFIG_SCSI_IPS is not set
++# CONFIG_SCSI_INITIO is not set
++# CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_STEX is not set
++# CONFIG_SCSI_SYM53C8XX_2 is not set
++# CONFIG_SCSI_QLOGIC_1280 is not set
++# CONFIG_SCSI_QLA_ISCSI is not set
++# CONFIG_SCSI_DC395x is not set
++# CONFIG_SCSI_AM53C974 is not set
++# CONFIG_SCSI_WD719X is not set
++# CONFIG_SCSI_DEBUG is not set
++# CONFIG_SCSI_PMCRAID is not set
++# CONFIG_SCSI_PM8001 is not set
++# CONFIG_SCSI_DH is not set
++# end of SCSI device support
++
++CONFIG_HAVE_PATA_PLATFORM=y
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_TARGET_CORE is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_FIREWIRE_NOSY is not set
++# end of IEEE 1394 (FireWire) support
++
++CONFIG_NETDEVICES=y
++CONFIG_MII=y
++CONFIG_NET_CORE=y
++# CONFIG_BONDING is not set
++CONFIG_DUMMY=m
++# CONFIG_WIREGUARD is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_NET_FC is not set
++# CONFIG_NET_TEAM is not set
++# CONFIG_MACVLAN is not set
++CONFIG_IPVLAN_L3S=y
++CONFIG_IPVLAN=m
++# CONFIG_IPVTAP is not set
++CONFIG_VXLAN=m
++# CONFIG_GENEVE is not set
++# CONFIG_BAREUDP is not set
++# CONFIG_GTP is not set
++# CONFIG_MACSEC is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_TUN is not set
++# CONFIG_TUN_VNET_CROSS_LE is not set
++CONFIG_VETH=m
++# CONFIG_NLMON is not set
++# CONFIG_ARCNET is not set
++
++#
++# Distributed Switch Architecture drivers
++#
++# end of Distributed Switch Architecture drivers
++
++CONFIG_ETHERNET=y
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_VENDOR_3SNIC is not set
++# CONFIG_NET_VENDOR_ADAPTEC is not set
++# CONFIG_NET_VENDOR_AGERE is not set
++# CONFIG_NET_VENDOR_ALACRITECH is not set
++# CONFIG_NET_VENDOR_ALTEON is not set
++# CONFIG_ALTERA_TSE is not set
++# CONFIG_NET_VENDOR_AMAZON is not set
++# CONFIG_NET_VENDOR_AMD is not set
++# CONFIG_NET_VENDOR_AQUANTIA is not set
++# CONFIG_NET_VENDOR_ARC is not set
++# CONFIG_NET_VENDOR_ATHEROS is not set
++# CONFIG_NET_VENDOR_AURORA is not set
++# CONFIG_NET_VENDOR_BROADCOM is not set
++# CONFIG_NET_VENDOR_BROCADE is not set
++# CONFIG_NET_VENDOR_CADENCE is not set
++# CONFIG_NET_VENDOR_CAVIUM is not set
++# CONFIG_NET_VENDOR_CHELSIO is not set
++# CONFIG_NET_VENDOR_CISCO is not set
++# CONFIG_NET_VENDOR_CORTINA is not set
++CONFIG_NET_VENDOR_VENDOR=y
++CONFIG_ETH_GMAC=y
++# CONFIG_GMAC_DDR_64BIT is not set
++CONFIG_GMAC_DESC_4WORD=y
++CONFIG_GMAC_RXCSUM=y
++CONFIG_RX_FLOW_CTRL_SUPPORT=y
++CONFIG_TX_FLOW_CTRL_SUPPORT=y
++CONFIG_TX_FLOW_CTRL_PAUSE_TIME=0xFFFF
++CONFIG_TX_FLOW_CTRL_PAUSE_INTERVAL=0xFFFF
++CONFIG_TX_FLOW_CTRL_ACTIVE_THRESHOLD=16
++CONFIG_TX_FLOW_CTRL_DEACTIVE_THRESHOLD=32
++# CONFIG_DNET is not set
++# CONFIG_NET_VENDOR_DEC is not set
++# CONFIG_NET_VENDOR_DLINK is not set
++# CONFIG_NET_VENDOR_EMULEX is not set
++# CONFIG_NET_VENDOR_EZCHIP is not set
++CONFIG_NET_VENDOR_GOOGLE=y
++# CONFIG_GVE is not set
++# CONFIG_NET_VENDOR_HISILICON is not set
++# CONFIG_NET_VENDOR_HUAWEI is not set
++# CONFIG_NET_VENDOR_INTEL is not set
++CONFIG_NET_VENDOR_NETSWIFT=y
++# CONFIG_NGBE is not set
++# CONFIG_TXGBE is not set
++# CONFIG_JME is not set
++# CONFIG_NET_VENDOR_MARVELL is not set
++# CONFIG_NET_VENDOR_MELLANOX is not set
++# CONFIG_NET_VENDOR_MICREL is not set
++# CONFIG_NET_VENDOR_MICROCHIP is not set
++# CONFIG_NET_VENDOR_MICROSEMI is not set
++# CONFIG_NET_VENDOR_MYRI is not set
++# CONFIG_FEALNX is not set
++# CONFIG_NET_VENDOR_NATSEMI is not set
++# CONFIG_NET_VENDOR_NETERION is not set
++# CONFIG_NET_VENDOR_NETRONOME is not set
++# CONFIG_NET_VENDOR_NI is not set
++# CONFIG_NET_VENDOR_NVIDIA is not set
++# CONFIG_NET_VENDOR_OKI is not set
++# CONFIG_ETHOC is not set
++# CONFIG_NET_VENDOR_PACKET_ENGINES is not set
++CONFIG_NET_VENDOR_PENSANDO=y
++# CONFIG_IONIC is not set
++# CONFIG_NET_VENDOR_QLOGIC is not set
++# CONFIG_NET_VENDOR_QUALCOMM is not set
++# CONFIG_NET_VENDOR_RDC is not set
++# CONFIG_NET_VENDOR_REALTEK is not set
++# CONFIG_NET_VENDOR_RENESAS is not set
++# CONFIG_NET_VENDOR_ROCKER is not set
++# CONFIG_NET_VENDOR_SAMSUNG is not set
++# CONFIG_NET_VENDOR_SEEQ is not set
++# CONFIG_NET_VENDOR_SOLARFLARE is not set
++# CONFIG_NET_VENDOR_SILAN is not set
++# CONFIG_NET_VENDOR_SIS is not set
++# CONFIG_NET_VENDOR_SMSC is not set
++# CONFIG_NET_VENDOR_SOCIONEXT is not set
++# CONFIG_NET_VENDOR_STMICRO is not set
++# CONFIG_NET_VENDOR_SUN is not set
++# CONFIG_NET_VENDOR_SYNOPSYS is not set
++# CONFIG_NET_VENDOR_TEHUTI is not set
++# CONFIG_NET_VENDOR_TI is not set
++# CONFIG_NET_VENDOR_VIA is not set
++# CONFIG_NET_VENDOR_WIZNET is not set
++CONFIG_NET_VENDOR_XILINX=y
++# CONFIG_XILINX_AXI_EMAC is not set
++# CONFIG_XILINX_LL_TEMAC is not set
++# CONFIG_NET_VENDOR_NEBULA_MATRIX is not set
++# CONFIG_FDDI is not set
++# CONFIG_HIPPI is not set
++CONFIG_PHYLIB=y
++CONFIG_SWPHY=y
++CONFIG_FIXED_PHY=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_AMD_PHY is not set
++# CONFIG_ADIN_PHY is not set
++# CONFIG_AQUANTIA_PHY is not set
++# CONFIG_AX88796B_PHY is not set
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_BCM54140_PHY is not set
++# CONFIG_BCM7XXX_PHY is not set
++# CONFIG_BCM84881_PHY is not set
++# CONFIG_BCM87XX_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_CORTINA_PHY is not set
++# CONFIG_DAVICOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_INTEL_XWAY_PHY is not set
++# CONFIG_LSI_ET1011C_PHY is not set
++# CONFIG_MARVELL_PHY is not set
++# CONFIG_MARVELL_10G_PHY is not set
++# CONFIG_MICREL_PHY is not set
++# CONFIG_MICROCHIP_PHY is not set
++# CONFIG_MICROCHIP_T1_PHY is not set
++# CONFIG_MICROSEMI_PHY is not set
++# CONFIG_NATIONAL_PHY is not set
++# CONFIG_AT803X_PHY is not set
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_REALTEK_PHY is not set
++# CONFIG_RENESAS_PHY is not set
++# CONFIG_ROCKCHIP_PHY is not set
++# CONFIG_SMSC_PHY is not set
++# CONFIG_STE10XP is not set
++# CONFIG_TERANETICS_PHY is not set
++# CONFIG_DP83822_PHY is not set
++# CONFIG_DP83TC811_PHY is not set
++# CONFIG_DP83848_PHY is not set
++# CONFIG_DP83867_PHY is not set
++# CONFIG_DP83869_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++# CONFIG_XILINX_GMII2RGMII is not set
++# CONFIG_MICREL_KS8995MA is not set
++CONFIG_SS928V100_PHY=y
++CONFIG_MDIO_DEVICE=y
++CONFIG_MDIO_BUS=y
++CONFIG_OF_MDIO=y
++CONFIG_MDIO_DEVRES=y
++# CONFIG_MDIO_BITBANG is not set
++# CONFIG_MDIO_BCM_UNIMAC is not set
++# CONFIG_MDIO_HISI_FEMAC is not set
++# CONFIG_MDIO_MVUSB is not set
++# CONFIG_MDIO_MSCC_MIIM is not set
++# CONFIG_MDIO_OCTEON is not set
++# CONFIG_MDIO_IPQ4019 is not set
++# CONFIG_MDIO_IPQ8064 is not set
++# CONFIG_MDIO_THUNDER is not set
++
++#
++# MDIO Multiplexers
++#
++# CONFIG_MDIO_BUS_MUX_GPIO is not set
++# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set
++# CONFIG_MDIO_BUS_MUX_MMIOREG is not set
++
++#
++# PCS device drivers
++#
++# CONFIG_PCS_XPCS is not set
++# end of PCS device drivers
++
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++CONFIG_USB_NET_DRIVERS=y
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++CONFIG_USB_RTL8152=y
++# CONFIG_USB_LAN78XX is not set
++CONFIG_USB_USBNET=y
++CONFIG_USB_NET_AX8817X=y
++CONFIG_USB_NET_AX88179_178A=y
++CONFIG_USB_NET_CDCETHER=y
++# CONFIG_USB_NET_CDC_EEM is not set
++CONFIG_USB_NET_CDC_NCM=y
++# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set
++# CONFIG_USB_NET_CDC_MBIM is not set
++# CONFIG_USB_NET_DM9601 is not set
++# CONFIG_USB_NET_SR9700 is not set
++# CONFIG_USB_NET_SR9800 is not set
++# CONFIG_USB_NET_SMSC75XX is not set
++# CONFIG_USB_NET_SMSC95XX is not set
++# CONFIG_USB_NET_GL620A is not set
++CONFIG_USB_NET_NET1080=y
++# CONFIG_USB_NET_PLUSB is not set
++# CONFIG_USB_NET_MCS7830 is not set
++CONFIG_USB_NET_RNDIS_HOST=y
++CONFIG_USB_NET_CDC_SUBSET_ENABLE=y
++CONFIG_USB_NET_CDC_SUBSET=y
++# CONFIG_USB_ALI_M5632 is not set
++# CONFIG_USB_AN2720 is not set
++CONFIG_USB_BELKIN=y
++CONFIG_USB_ARMLINUX=y
++# CONFIG_USB_EPSON2888 is not set
++# CONFIG_USB_KC2190 is not set
++CONFIG_USB_NET_ZAURUS=y
++# CONFIG_USB_NET_CX82310_ETH is not set
++# CONFIG_USB_NET_KALMIA is not set
++CONFIG_USB_NET_QMI_WWAN=y
++# CONFIG_USB_NET_INT51X1 is not set
++# CONFIG_USB_IPHETH is not set
++# CONFIG_USB_SIERRA_NET is not set
++# CONFIG_USB_VL600 is not set
++# CONFIG_USB_NET_CH9200 is not set
++# CONFIG_USB_NET_AQC111 is not set
++CONFIG_WLAN=y
++# CONFIG_WIRELESS_WDS is not set
++# CONFIG_WLAN_VENDOR_ADMTEK is not set
++# CONFIG_WLAN_VENDOR_ATH is not set
++# CONFIG_WLAN_VENDOR_ATMEL is not set
++# CONFIG_WLAN_VENDOR_BROADCOM is not set
++# CONFIG_WLAN_VENDOR_CISCO is not set
++# CONFIG_WLAN_VENDOR_INTEL is not set
++# CONFIG_WLAN_VENDOR_INTERSIL is not set
++# CONFIG_WLAN_VENDOR_MARVELL is not set
++# CONFIG_WLAN_VENDOR_MEDIATEK is not set
++CONFIG_WLAN_VENDOR_MICROCHIP=y
++# CONFIG_WILC1000_SDIO is not set
++# CONFIG_WILC1000_SPI is not set
++# CONFIG_WLAN_VENDOR_RALINK is not set
++# CONFIG_WLAN_VENDOR_REALTEK is not set
++# CONFIG_WLAN_VENDOR_RSI is not set
++# CONFIG_WLAN_VENDOR_ST is not set
++# CONFIG_WLAN_VENDOR_TI is not set
++# CONFIG_WLAN_VENDOR_ZYDAS is not set
++# CONFIG_WLAN_VENDOR_QUANTENNA is not set
++# CONFIG_MAC80211_HWSIM is not set
++# CONFIG_USB_NET_RNDIS_WLAN is not set
++# CONFIG_VIRT_WIFI is not set
++
++#
++# Enable WiMAX (Networking options) to see the WiMAX drivers
++#
++# CONFIG_WAN is not set
++# CONFIG_VMXNET3 is not set
++# CONFIG_NETDEVSIM is not set
++# CONFIG_NET_FAILOVER is not set
++# CONFIG_NET_LOCALIP_LST is not set
++# CONFIG_ISDN is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++CONFIG_INPUT_FF_MEMLESS=y
++# CONFIG_INPUT_POLLDEV is not set
++# CONFIG_INPUT_SPARSEKMAP is not set
++# CONFIG_INPUT_MATRIXKMAP is not set
++
++#
++# Userland interfaces
++#
++CONFIG_INPUT_MOUSEDEV=y
++CONFIG_INPUT_MOUSEDEV_PSAUX=y
++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
++CONFIG_INPUT_JOYDEV=y
++CONFIG_INPUT_EVDEV=y
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++CONFIG_INPUT_KEYBOARD=y
++# CONFIG_KEYBOARD_ADC is not set
++# CONFIG_KEYBOARD_ADP5588 is not set
++# CONFIG_KEYBOARD_ADP5589 is not set
++CONFIG_KEYBOARD_ATKBD=y
++# CONFIG_KEYBOARD_QT1050 is not set
++# CONFIG_KEYBOARD_QT1070 is not set
++# CONFIG_KEYBOARD_QT2160 is not set
++# CONFIG_KEYBOARD_DLINK_DIR685 is not set
++# CONFIG_KEYBOARD_LKKBD is not set
++# CONFIG_KEYBOARD_GPIO is not set
++# CONFIG_KEYBOARD_GPIO_POLLED is not set
++# CONFIG_KEYBOARD_TCA6416 is not set
++# CONFIG_KEYBOARD_TCA8418 is not set
++# CONFIG_KEYBOARD_MATRIX is not set
++# CONFIG_KEYBOARD_LM8333 is not set
++# CONFIG_KEYBOARD_MAX7359 is not set
++# CONFIG_KEYBOARD_MCS is not set
++# CONFIG_KEYBOARD_MPR121 is not set
++# CONFIG_KEYBOARD_NEWTON is not set
++# CONFIG_KEYBOARD_OPENCORES is not set
++# CONFIG_KEYBOARD_SAMSUNG is not set
++# CONFIG_KEYBOARD_STOWAWAY is not set
++# CONFIG_KEYBOARD_SUNKBD is not set
++# CONFIG_KEYBOARD_OMAP4 is not set
++# CONFIG_KEYBOARD_XTKBD is not set
++# CONFIG_KEYBOARD_CAP11XX is not set
++# CONFIG_KEYBOARD_BCM is not set
++CONFIG_INPUT_MOUSE=y
++CONFIG_MOUSE_PS2=y
++CONFIG_MOUSE_PS2_ALPS=y
++CONFIG_MOUSE_PS2_BYD=y
++CONFIG_MOUSE_PS2_LOGIPS2PP=y
++CONFIG_MOUSE_PS2_SYNAPTICS=y
++CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y
++CONFIG_MOUSE_PS2_CYPRESS=y
++CONFIG_MOUSE_PS2_TRACKPOINT=y
++# CONFIG_MOUSE_PS2_ELANTECH is not set
++# CONFIG_MOUSE_PS2_SENTELIC is not set
++# CONFIG_MOUSE_PS2_TOUCHKIT is not set
++CONFIG_MOUSE_PS2_FOCALTECH=y
++CONFIG_MOUSE_PS2_SMBUS=y
++# CONFIG_MOUSE_SERIAL is not set
++# CONFIG_MOUSE_APPLETOUCH is not set
++# CONFIG_MOUSE_BCM5974 is not set
++# CONFIG_MOUSE_CYAPA is not set
++# CONFIG_MOUSE_ELAN_I2C is not set
++# CONFIG_MOUSE_VSXXXAA is not set
++# CONFIG_MOUSE_GPIO is not set
++# CONFIG_MOUSE_SYNAPTICS_I2C is not set
++# CONFIG_MOUSE_SYNAPTICS_USB is not set
++CONFIG_INPUT_JOYSTICK=y
++# CONFIG_JOYSTICK_ANALOG is not set
++# CONFIG_JOYSTICK_A3D is not set
++# CONFIG_JOYSTICK_ADC is not set
++# CONFIG_JOYSTICK_ADI is not set
++# CONFIG_JOYSTICK_COBRA is not set
++# CONFIG_JOYSTICK_GF2K is not set
++# CONFIG_JOYSTICK_GRIP is not set
++# CONFIG_JOYSTICK_GRIP_MP is not set
++# CONFIG_JOYSTICK_GUILLEMOT is not set
++# CONFIG_JOYSTICK_INTERACT is not set
++# CONFIG_JOYSTICK_SIDEWINDER is not set
++# CONFIG_JOYSTICK_TMDC is not set
++# CONFIG_JOYSTICK_IFORCE is not set
++# CONFIG_JOYSTICK_WARRIOR is not set
++# CONFIG_JOYSTICK_MAGELLAN is not set
++# CONFIG_JOYSTICK_SPACEORB is not set
++# CONFIG_JOYSTICK_SPACEBALL is not set
++# CONFIG_JOYSTICK_STINGER is not set
++# CONFIG_JOYSTICK_TWIDJOY is not set
++# CONFIG_JOYSTICK_ZHENHUA is not set
++# CONFIG_JOYSTICK_AS5011 is not set
++# CONFIG_JOYSTICK_JOYDUMP is not set
++# CONFIG_JOYSTICK_XPAD is not set
++# CONFIG_JOYSTICK_PSXPAD_SPI is not set
++# CONFIG_JOYSTICK_PXRC is not set
++# CONFIG_JOYSTICK_FSIA6B is not set
++# CONFIG_INPUT_TABLET is not set
++CONFIG_INPUT_TOUCHSCREEN=y
++CONFIG_TOUCHSCREEN_PROPERTIES=y
++# CONFIG_TOUCHSCREEN_ADS7846 is not set
++# CONFIG_TOUCHSCREEN_AD7877 is not set
++# CONFIG_TOUCHSCREEN_AD7879 is not set
++# CONFIG_TOUCHSCREEN_ADC is not set
++# CONFIG_TOUCHSCREEN_AR1021_I2C is not set
++# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
++# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
++# CONFIG_TOUCHSCREEN_BU21013 is not set
++# CONFIG_TOUCHSCREEN_BU21029 is not set
++# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set
++# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set
++# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
++# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
++# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set
++# CONFIG_TOUCHSCREEN_DYNAPRO is not set
++# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
++# CONFIG_TOUCHSCREEN_EETI is not set
++# CONFIG_TOUCHSCREEN_EGALAX is not set
++# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set
++# CONFIG_TOUCHSCREEN_EXC3000 is not set
++# CONFIG_TOUCHSCREEN_FUJITSU is not set
++CONFIG_TOUCHSCREEN_GOODIX=y
++# CONFIG_TOUCHSCREEN_HIDEEP is not set
++# CONFIG_TOUCHSCREEN_ILI210X is not set
++# CONFIG_TOUCHSCREEN_S6SY761 is not set
++# CONFIG_TOUCHSCREEN_GUNZE is not set
++# CONFIG_TOUCHSCREEN_EKTF2127 is not set
++# CONFIG_TOUCHSCREEN_ELAN is not set
++# CONFIG_TOUCHSCREEN_ELO is not set
++# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
++# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
++# CONFIG_TOUCHSCREEN_MAX11801 is not set
++# CONFIG_TOUCHSCREEN_MCS5000 is not set
++# CONFIG_TOUCHSCREEN_MMS114 is not set
++# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
++# CONFIG_TOUCHSCREEN_MTOUCH is not set
++# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set
++# CONFIG_TOUCHSCREEN_INEXIO is not set
++# CONFIG_TOUCHSCREEN_MK712 is not set
++# CONFIG_TOUCHSCREEN_PENMOUNT is not set
++# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set
++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
++# CONFIG_TOUCHSCREEN_PIXCIR is not set
++# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set
++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
++# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
++# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
++# CONFIG_TOUCHSCREEN_TSC2004 is not set
++# CONFIG_TOUCHSCREEN_TSC2005 is not set
++# CONFIG_TOUCHSCREEN_TSC2007 is not set
++# CONFIG_TOUCHSCREEN_RM_TS is not set
++# CONFIG_TOUCHSCREEN_SILEAD is not set
++# CONFIG_TOUCHSCREEN_SIS_I2C is not set
++# CONFIG_TOUCHSCREEN_ST1232 is not set
++# CONFIG_TOUCHSCREEN_SUR40 is not set
++# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set
++# CONFIG_TOUCHSCREEN_SX8654 is not set
++# CONFIG_TOUCHSCREEN_TPS6507X is not set
++# CONFIG_TOUCHSCREEN_ZET6223 is not set
++# CONFIG_TOUCHSCREEN_ZFORCE is not set
++# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set
++# CONFIG_TOUCHSCREEN_IQS5XX is not set
++# CONFIG_TOUCHSCREEN_ZINITIX is not set
++CONFIG_INPUT_MISC=y
++# CONFIG_INPUT_AD714X is not set
++# CONFIG_INPUT_ATMEL_CAPTOUCH is not set
++# CONFIG_INPUT_BMA150 is not set
++# CONFIG_INPUT_E3X0_BUTTON is not set
++# CONFIG_INPUT_MMA8450 is not set
++# CONFIG_INPUT_GPIO_BEEPER is not set
++# CONFIG_INPUT_GPIO_DECODER is not set
++# CONFIG_INPUT_GPIO_VIBRA is not set
++# CONFIG_INPUT_ATI_REMOTE2 is not set
++# CONFIG_INPUT_KEYSPAN_REMOTE is not set
++# CONFIG_INPUT_KXTJ9 is not set
++# CONFIG_INPUT_POWERMATE is not set
++# CONFIG_INPUT_YEALINK is not set
++# CONFIG_INPUT_CM109 is not set
++# CONFIG_INPUT_REGULATOR_HAPTIC is not set
++CONFIG_INPUT_UINPUT=y
++# CONFIG_INPUT_PCF8574 is not set
++# CONFIG_INPUT_PWM_BEEPER is not set
++# CONFIG_INPUT_PWM_VIBRA is not set
++# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
++# CONFIG_INPUT_ADXL34X is not set
++# CONFIG_INPUT_IQS269A is not set
++# CONFIG_INPUT_CMA3000 is not set
++# CONFIG_INPUT_DRV260X_HAPTICS is not set
++# CONFIG_INPUT_DRV2665_HAPTICS is not set
++# CONFIG_INPUT_DRV2667_HAPTICS is not set
++# CONFIG_RMI4_CORE is not set
++
++#
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_SERPORT=y
++# CONFIG_SERIO_AMBAKMI is not set
++# CONFIG_SERIO_PCIPS2 is not set
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_SERIO_ALTERA_PS2 is not set
++# CONFIG_SERIO_PS2MULT is not set
++# CONFIG_SERIO_ARC_PS2 is not set
++# CONFIG_SERIO_APBPS2 is not set
++# CONFIG_SERIO_GPIO_PS2 is not set
++# CONFIG_USERIO is not set
++CONFIG_GAMEPORT=y
++# CONFIG_GAMEPORT_NS558 is not set
++# CONFIG_GAMEPORT_L4 is not set
++# CONFIG_GAMEPORT_EMU10K1 is not set
++# CONFIG_GAMEPORT_FM801 is not set
++# end of Hardware I/O ports
++# end of Input device support
++
++#
++# Character devices
++#
++CONFIG_TTY=y
++CONFIG_VT=y
++CONFIG_CONSOLE_TRANSLATIONS=y
++CONFIG_VT_CONSOLE=y
++CONFIG_VT_CONSOLE_SLEEP=y
++CONFIG_HW_CONSOLE=y
++# CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_UNIX98_PTYS=y
++# CONFIG_LEGACY_PTYS is not set
++CONFIG_LDISC_AUTOLOAD=y
++
++#
++# Serial drivers
++#
++CONFIG_SERIAL_EARLYCON=y
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++# CONFIG_SERIAL_AMBA_PL010 is not set
++CONFIG_SERIAL_AMBA_PL011=y
++CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
++# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set
++# CONFIG_SERIAL_MAX3100 is not set
++# CONFIG_SERIAL_MAX310X is not set
++# CONFIG_SERIAL_UARTLITE is not set
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++# CONFIG_SERIAL_JSM is not set
++# CONFIG_SERIAL_SIFIVE is not set
++# CONFIG_SERIAL_SCCNXP is not set
++# CONFIG_SERIAL_SC16IS7XX is not set
++# CONFIG_SERIAL_ALTERA_JTAGUART is not set
++# CONFIG_SERIAL_ALTERA_UART is not set
++# CONFIG_SERIAL_IFX6X60 is not set
++# CONFIG_SERIAL_XILINX_PS_UART is not set
++# CONFIG_SERIAL_ARC is not set
++# CONFIG_SERIAL_RP2 is not set
++# CONFIG_SERIAL_FSL_LPUART is not set
++# CONFIG_SERIAL_FSL_LINFLEXUART is not set
++# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set
++# CONFIG_SERIAL_SPRD is not set
++# end of Serial drivers
++
++# CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_N_GSM is not set
++# CONFIG_NOZOMI is not set
++# CONFIG_NULL_TTY is not set
++# CONFIG_TRACE_SINK is not set
++# CONFIG_HVC_DCC is not set
++# CONFIG_SERIAL_DEV_BUS is not set
++# CONFIG_TTY_PRINTK is not set
++# CONFIG_VIRTIO_CONSOLE is not set
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_APPLICOM is not set
++CONFIG_DEVMEM=y
++# CONFIG_RAW_DRIVER is not set
++CONFIG_DEVPORT=y
++# CONFIG_TCG_TPM is not set
++# CONFIG_XILLYBUS is not set
++# CONFIG_RANDOM_TRUST_CPU is not set
++# CONFIG_RANDOM_TRUST_BOOTLOADER is not set
++# end of Character devices
++
++#
++# I2C support
++#
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++# CONFIG_I2C_COMPAT is not set
++CONFIG_I2C_CHARDEV=y
++CONFIG_I2C_MUX=y
++
++#
++# Multiplexer I2C Chip support
++#
++# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set
++# CONFIG_I2C_MUX_GPIO is not set
++# CONFIG_I2C_MUX_GPMUX is not set
++# CONFIG_I2C_MUX_LTC4306 is not set
++# CONFIG_I2C_MUX_PCA9541 is not set
++# CONFIG_I2C_MUX_PCA954x is not set
++# CONFIG_I2C_MUX_PINCTRL is not set
++# CONFIG_I2C_MUX_REG is not set
++# CONFIG_I2C_DEMUX_PINCTRL is not set
++# CONFIG_I2C_MUX_MLXCPLD is not set
++# end of Multiplexer I2C Chip support
++
++# CONFIG_I2C_HELPER_AUTO is not set
++# CONFIG_I2C_SMBUS is not set
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++# end of I2C Algorithms
++
++#
++# I2C Hardware Bus support
++#
++
++#
++# PC SMBus host controller drivers
++#
++# CONFIG_I2C_ALI1535 is not set
++# CONFIG_I2C_ALI1563 is not set
++# CONFIG_I2C_ALI15X3 is not set
++# CONFIG_I2C_AMD756 is not set
++# CONFIG_I2C_AMD8111 is not set
++# CONFIG_I2C_I801 is not set
++# CONFIG_I2C_ISCH is not set
++# CONFIG_I2C_PIIX4 is not set
++# CONFIG_I2C_NFORCE2 is not set
++# CONFIG_I2C_NVIDIA_GPU is not set
++# CONFIG_I2C_SIS5595 is not set
++# CONFIG_I2C_SIS630 is not set
++# CONFIG_I2C_SIS96X is not set
++# CONFIG_I2C_VIA is not set
++# CONFIG_I2C_VIAPRO is not set
++
++#
++# I2C system bus drivers (mostly embedded / system-on-chip)
++#
++# CONFIG_I2C_CADENCE is not set
++# CONFIG_I2C_CBUS_GPIO is not set
++# CONFIG_I2C_DESIGNWARE_PLATFORM is not set
++# CONFIG_I2C_DESIGNWARE_PCI is not set
++# CONFIG_I2C_EMEV2 is not set
++# CONFIG_I2C_GPIO is not set
++CONFIG_I2C_BSP=y
++# CONFIG_I2C_HISI is not set
++# CONFIG_I2C_NOMADIK is not set
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
++# CONFIG_I2C_RK3X is not set
++# CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_THUNDERX is not set
++# CONFIG_I2C_XILINX is not set
++
++#
++# External I2C/SMBus adapter drivers
++#
++# CONFIG_I2C_DIOLAN_U2C is not set
++# CONFIG_I2C_ROBOTFUZZ_OSIF is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_TINY_USB is not set
++
++#
++# Other I2C/SMBus bus drivers
++#
++CONFIG_DMA_MSG_MIN_LEN=5
++CONFIG_DMA_MSG_MAX_LEN=4090
++# end of I2C Hardware Bus support
++
++# CONFIG_I2C_STUB is not set
++# CONFIG_I2C_SLAVE is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++# end of I2C support
++
++# CONFIG_I3C is not set
++CONFIG_SPI=y
++# CONFIG_SPI_DEBUG is not set
++CONFIG_SPI_MASTER=y
++# CONFIG_SPI_MEM is not set
++
++#
++# SPI Master Controller Drivers
++#
++# CONFIG_SPI_ALTERA is not set
++# CONFIG_SPI_AXI_SPI_ENGINE is not set
++# CONFIG_SPI_BITBANG is not set
++# CONFIG_SPI_CADENCE is not set
++# CONFIG_SPI_CADENCE_QUADSPI is not set
++# CONFIG_SPI_DESIGNWARE is not set
++# CONFIG_SPI_NXP_FLEXSPI is not set
++# CONFIG_SPI_GPIO is not set
++# CONFIG_SPI_FSL_SPI is not set
++# CONFIG_SPI_OC_TINY is not set
++CONFIG_SPI_PL022=y
++# CONFIG_SPI_PXA2XX is not set
++# CONFIG_SPI_ROCKCHIP is not set
++# CONFIG_SPI_SC18IS602 is not set
++# CONFIG_SPI_SIFIVE is not set
++# CONFIG_SPI_MXIC is not set
++# CONFIG_SPI_THUNDERX is not set
++# CONFIG_SPI_XCOMM is not set
++# CONFIG_SPI_XILINX is not set
++# CONFIG_SPI_ZYNQMP_GQSPI is not set
++# CONFIG_SPI_AMD is not set
++
++#
++# SPI Multiplexer support
++#
++# CONFIG_SPI_MUX is not set
++
++#
++# SPI Protocol Masters
++#
++CONFIG_SPI_SPIDEV=y
++# CONFIG_SPI_LOOPBACK_TEST is not set
++# CONFIG_SPI_TLE62X0 is not set
++# CONFIG_SPI_SLAVE is not set
++# CONFIG_SPMI is not set
++# CONFIG_HSI is not set
++# CONFIG_PPS is not set
++
++#
++# PTP clock support
++#
++# CONFIG_PTP_1588_CLOCK is not set
++
++#
++# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
++#
++# CONFIG_PTP_HISI is not set
++# end of PTP clock support
++
++CONFIG_PINCTRL=y
++CONFIG_GENERIC_PINCTRL_GROUPS=y
++CONFIG_PINMUX=y
++CONFIG_GENERIC_PINMUX_FUNCTIONS=y
++CONFIG_PINCONF=y
++CONFIG_GENERIC_PINCONF=y
++# CONFIG_DEBUG_PINCTRL is not set
++# CONFIG_PINCTRL_MCP23S08 is not set
++CONFIG_PINCTRL_SINGLE=y
++# CONFIG_PINCTRL_SX150X is not set
++# CONFIG_PINCTRL_STMFX is not set
++# CONFIG_PINCTRL_OCELOT is not set
++
++#
++# Renesas pinctrl drivers
++#
++# end of Renesas pinctrl drivers
++
++CONFIG_GPIOLIB=y
++CONFIG_GPIOLIB_FASTPATH_LIMIT=512
++CONFIG_OF_GPIO=y
++CONFIG_GPIOLIB_IRQCHIP=y
++CONFIG_DEBUG_GPIO=y
++CONFIG_GPIO_SYSFS=y
++CONFIG_GPIO_CDEV=y
++CONFIG_GPIO_CDEV_V1=y
++CONFIG_GPIO_GENERIC=y
++
++#
++# Memory mapped GPIO drivers
++#
++# CONFIG_GPIO_74XX_MMIO is not set
++# CONFIG_GPIO_ALTERA is not set
++# CONFIG_GPIO_CADENCE is not set
++# CONFIG_GPIO_DWAPB is not set
++# CONFIG_GPIO_FTGPIO010 is not set
++CONFIG_GPIO_GENERIC_PLATFORM=y
++# CONFIG_GPIO_GRGPIO is not set
++# CONFIG_GPIO_HLWD is not set
++# CONFIG_GPIO_LOGICVC is not set
++# CONFIG_GPIO_MB86S7X is not set
++CONFIG_GPIO_PL061=y
++# CONFIG_GPIO_SAMA5D2_PIOBU is not set
++# CONFIG_GPIO_SIFIVE is not set
++# CONFIG_GPIO_SYSCON is not set
++# CONFIG_GPIO_XGENE is not set
++# CONFIG_GPIO_XILINX is not set
++# CONFIG_GPIO_AMD_FCH is not set
++# end of Memory mapped GPIO drivers
++
++#
++# I2C GPIO expanders
++#
++# CONFIG_GPIO_ADP5588 is not set
++# CONFIG_GPIO_ADNP is not set
++# CONFIG_GPIO_GW_PLD is not set
++# CONFIG_GPIO_MAX7300 is not set
++# CONFIG_GPIO_MAX732X is not set
++# CONFIG_GPIO_PCA953X is not set
++# CONFIG_GPIO_PCA9570 is not set
++# CONFIG_GPIO_PCF857X is not set
++# CONFIG_GPIO_TPIC2810 is not set
++# end of I2C GPIO expanders
++
++#
++# MFD GPIO expanders
++#
++# end of MFD GPIO expanders
++
++#
++# PCI GPIO expanders
++#
++# CONFIG_GPIO_BT8XX is not set
++# CONFIG_GPIO_PCI_IDIO_16 is not set
++# CONFIG_GPIO_PCIE_IDIO_24 is not set
++# CONFIG_GPIO_RDC321X is not set
++# end of PCI GPIO expanders
++
++#
++# SPI GPIO expanders
++#
++# CONFIG_GPIO_74X164 is not set
++# CONFIG_GPIO_MAX3191X is not set
++# CONFIG_GPIO_MAX7301 is not set
++# CONFIG_GPIO_MC33880 is not set
++# CONFIG_GPIO_PISOSR is not set
++# CONFIG_GPIO_XRA1403 is not set
++# end of SPI GPIO expanders
++
++#
++# USB GPIO expanders
++#
++# end of USB GPIO expanders
++
++# CONFIG_GPIO_AGGREGATOR is not set
++# CONFIG_GPIO_MOCKUP is not set
++# CONFIG_W1 is not set
++CONFIG_POWER_RESET=y
++# CONFIG_POWER_RESET_BRCMSTB is not set
++# CONFIG_POWER_RESET_GPIO is not set
++# CONFIG_POWER_RESET_GPIO_RESTART is not set
++# CONFIG_POWER_RESET_LTC2952 is not set
++# CONFIG_POWER_RESET_RESTART is not set
++# CONFIG_POWER_RESET_XGENE is not set
++# CONFIG_POWER_RESET_SYSCON is not set
++# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set
++# CONFIG_SYSCON_REBOOT_MODE is not set
++# CONFIG_NVMEM_REBOOT_MODE is not set
++CONFIG_POWER_SUPPLY=y
++# CONFIG_POWER_SUPPLY_DEBUG is not set
++# CONFIG_PDA_POWER is not set
++# CONFIG_GENERIC_ADC_BATTERY is not set
++# CONFIG_TEST_POWER is not set
++# CONFIG_CHARGER_ADP5061 is not set
++# CONFIG_BATTERY_CW2015 is not set
++# CONFIG_BATTERY_DS2780 is not set
++# CONFIG_BATTERY_DS2781 is not set
++# CONFIG_BATTERY_DS2782 is not set
++# CONFIG_BATTERY_SBS is not set
++# CONFIG_CHARGER_SBS is not set
++# CONFIG_MANAGER_SBS is not set
++# CONFIG_BATTERY_BQ27XXX is not set
++# CONFIG_BATTERY_MAX17040 is not set
++# CONFIG_BATTERY_MAX17042 is not set
++# CONFIG_CHARGER_MAX8903 is not set
++# CONFIG_CHARGER_LP8727 is not set
++# CONFIG_CHARGER_GPIO is not set
++# CONFIG_CHARGER_MANAGER is not set
++# CONFIG_CHARGER_LT3651 is not set
++# CONFIG_CHARGER_DETECTOR_MAX14656 is not set
++# CONFIG_CHARGER_BQ2415X is not set
++# CONFIG_CHARGER_BQ24257 is not set
++# CONFIG_CHARGER_BQ24735 is not set
++# CONFIG_CHARGER_BQ2515X is not set
++# CONFIG_CHARGER_BQ25890 is not set
++# CONFIG_CHARGER_BQ25980 is not set
++# CONFIG_CHARGER_SMB347 is not set
++# CONFIG_BATTERY_GAUGE_LTC2941 is not set
++# CONFIG_BATTERY_RT5033 is not set
++# CONFIG_CHARGER_RT9455 is not set
++# CONFIG_CHARGER_UCS1002 is not set
++# CONFIG_CHARGER_BD99954 is not set
++# CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
++# CONFIG_WATCHDOG is not set
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
++CONFIG_BCMA_POSSIBLE=y
++# CONFIG_BCMA is not set
++
++#
++# Multifunction device drivers
++#
++# CONFIG_MFD_ACT8945A is not set
++# CONFIG_MFD_AS3711 is not set
++# CONFIG_MFD_AS3722 is not set
++# CONFIG_PMIC_ADP5520 is not set
++# CONFIG_MFD_AAT2870_CORE is not set
++# CONFIG_MFD_ATMEL_FLEXCOM is not set
++# CONFIG_MFD_ATMEL_HLCDC is not set
++# CONFIG_MFD_BCM590XX is not set
++# CONFIG_MFD_BD9571MWV is not set
++# CONFIG_MFD_AXP20X_I2C is not set
++# CONFIG_MFD_MADERA is not set
++# CONFIG_PMIC_DA903X is not set
++# CONFIG_MFD_DA9052_SPI is not set
++# CONFIG_MFD_DA9052_I2C is not set
++# CONFIG_MFD_DA9055 is not set
++# CONFIG_MFD_DA9062 is not set
++# CONFIG_MFD_DA9063 is not set
++# CONFIG_MFD_DA9150 is not set
++# CONFIG_MFD_DLN2 is not set
++# CONFIG_MFD_GATEWORKS_GSC is not set
++# CONFIG_MFD_MC13XXX_SPI is not set
++# CONFIG_MFD_MC13XXX_I2C is not set
++# CONFIG_MFD_MP2629 is not set
++# CONFIG_MFD_HI6421_PMIC is not set
++# CONFIG_HTC_PASIC3 is not set
++# CONFIG_HTC_I2CPLD is not set
++# CONFIG_LPC_ICH is not set
++# CONFIG_LPC_SCH is not set
++# CONFIG_MFD_INTEL_PMT is not set
++# CONFIG_MFD_IQS62X is not set
++# CONFIG_MFD_JANZ_CMODIO is not set
++# CONFIG_MFD_KEMPLD is not set
++# CONFIG_MFD_88PM800 is not set
++# CONFIG_MFD_88PM805 is not set
++# CONFIG_MFD_88PM860X is not set
++# CONFIG_MFD_MAX14577 is not set
++# CONFIG_MFD_MAX77620 is not set
++# CONFIG_MFD_MAX77650 is not set
++# CONFIG_MFD_MAX77686 is not set
++# CONFIG_MFD_MAX77693 is not set
++# CONFIG_MFD_MAX77843 is not set
++# CONFIG_MFD_MAX8907 is not set
++# CONFIG_MFD_MAX8925 is not set
++# CONFIG_MFD_MAX8997 is not set
++# CONFIG_MFD_MAX8998 is not set
++# CONFIG_MFD_MT6360 is not set
++# CONFIG_MFD_MT6397 is not set
++# CONFIG_MFD_MENF21BMC is not set
++# CONFIG_EZX_PCAP is not set
++# CONFIG_MFD_CPCAP is not set
++# CONFIG_MFD_VIPERBOARD is not set
++# CONFIG_MFD_RETU is not set
++# CONFIG_MFD_PCF50633 is not set
++# CONFIG_MFD_RDC321X is not set
++# CONFIG_MFD_RT5033 is not set
++# CONFIG_MFD_RC5T583 is not set
++# CONFIG_MFD_RK808 is not set
++# CONFIG_MFD_RN5T618 is not set
++# CONFIG_MFD_SEC_CORE is not set
++# CONFIG_MFD_SI476X_CORE is not set
++# CONFIG_MFD_SM501 is not set
++# CONFIG_MFD_SKY81452 is not set
++# CONFIG_ABX500_CORE is not set
++# CONFIG_MFD_STMPE is not set
++CONFIG_MFD_SYSCON=y
++# CONFIG_MFD_TI_AM335X_TSCADC is not set
++# CONFIG_MFD_LP3943 is not set
++# CONFIG_MFD_LP8788 is not set
++# CONFIG_MFD_TI_LMU is not set
++# CONFIG_MFD_PALMAS is not set
++# CONFIG_TPS6105X is not set
++# CONFIG_TPS65010 is not set
++# CONFIG_TPS6507X is not set
++# CONFIG_MFD_TPS65086 is not set
++# CONFIG_MFD_TPS65090 is not set
++# CONFIG_MFD_TPS65217 is not set
++# CONFIG_MFD_TI_LP873X is not set
++# CONFIG_MFD_TI_LP87565 is not set
++# CONFIG_MFD_TPS65218 is not set
++# CONFIG_MFD_TPS6586X is not set
++# CONFIG_MFD_TPS65910 is not set
++# CONFIG_MFD_TPS65912_I2C is not set
++# CONFIG_MFD_TPS65912_SPI is not set
++# CONFIG_MFD_TPS80031 is not set
++# CONFIG_TWL4030_CORE is not set
++# CONFIG_TWL6040_CORE is not set
++# CONFIG_MFD_WL1273_CORE is not set
++# CONFIG_MFD_LM3533 is not set
++# CONFIG_MFD_TC3589X is not set
++# CONFIG_MFD_TQMX86 is not set
++# CONFIG_MFD_VX855 is not set
++# CONFIG_MFD_LOCHNAGAR is not set
++# CONFIG_MFD_ARIZONA_I2C is not set
++# CONFIG_MFD_ARIZONA_SPI is not set
++# CONFIG_MFD_WM8400 is not set
++# CONFIG_MFD_WM831X_I2C is not set
++# CONFIG_MFD_WM831X_SPI is not set
++# CONFIG_MFD_WM8350_I2C is not set
++# CONFIG_MFD_WM8994 is not set
++# CONFIG_MFD_ROHM_BD718XX is not set
++# CONFIG_MFD_ROHM_BD70528 is not set
++# CONFIG_MFD_ROHM_BD71828 is not set
++# CONFIG_MFD_STPMIC1 is not set
++# CONFIG_MFD_STMFX is not set
++# CONFIG_MFD_INTEL_M10_BMC is not set
++# end of Multifunction device drivers
++
++CONFIG_REGULATOR=y
++# CONFIG_REGULATOR_DEBUG is not set
++# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
++# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
++# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
++# CONFIG_REGULATOR_88PG86X is not set
++# CONFIG_REGULATOR_ACT8865 is not set
++# CONFIG_REGULATOR_AD5398 is not set
++# CONFIG_REGULATOR_DA9210 is not set
++# CONFIG_REGULATOR_DA9211 is not set
++# CONFIG_REGULATOR_FAN53555 is not set
++# CONFIG_REGULATOR_FAN53880 is not set
++# CONFIG_REGULATOR_GPIO is not set
++# CONFIG_REGULATOR_ISL9305 is not set
++# CONFIG_REGULATOR_ISL6271A is not set
++# CONFIG_REGULATOR_LP3971 is not set
++# CONFIG_REGULATOR_LP3972 is not set
++# CONFIG_REGULATOR_LP872X is not set
++# CONFIG_REGULATOR_LP8755 is not set
++# CONFIG_REGULATOR_LTC3589 is not set
++# CONFIG_REGULATOR_LTC3676 is not set
++# CONFIG_REGULATOR_MAX1586 is not set
++# CONFIG_REGULATOR_MAX8649 is not set
++# CONFIG_REGULATOR_MAX8660 is not set
++# CONFIG_REGULATOR_MAX8952 is not set
++# CONFIG_REGULATOR_MAX77826 is not set
++# CONFIG_REGULATOR_MCP16502 is not set
++# CONFIG_REGULATOR_MP5416 is not set
++# CONFIG_REGULATOR_MP8859 is not set
++# CONFIG_REGULATOR_MP886X is not set
++# CONFIG_REGULATOR_MPQ7920 is not set
++# CONFIG_REGULATOR_MT6311 is not set
++# CONFIG_REGULATOR_PCA9450 is not set
++# CONFIG_REGULATOR_PFUZE100 is not set
++# CONFIG_REGULATOR_PV88060 is not set
++# CONFIG_REGULATOR_PV88080 is not set
++# CONFIG_REGULATOR_PV88090 is not set
++# CONFIG_REGULATOR_PWM is not set
++# CONFIG_REGULATOR_RT4801 is not set
++# CONFIG_REGULATOR_RTMV20 is not set
++# CONFIG_REGULATOR_SLG51000 is not set
++# CONFIG_REGULATOR_SY8106A is not set
++# CONFIG_REGULATOR_SY8824X is not set
++# CONFIG_REGULATOR_SY8827N is not set
++# CONFIG_REGULATOR_TPS51632 is not set
++# CONFIG_REGULATOR_TPS62360 is not set
++# CONFIG_REGULATOR_TPS65023 is not set
++# CONFIG_REGULATOR_TPS6507X is not set
++# CONFIG_REGULATOR_TPS65132 is not set
++# CONFIG_REGULATOR_TPS6524X is not set
++# CONFIG_REGULATOR_VCTRL is not set
++# CONFIG_RC_CORE is not set
++# CONFIG_MEDIA_CEC_SUPPORT is not set
++CONFIG_MEDIA_SUPPORT=y
++# CONFIG_MEDIA_SUPPORT_FILTER is not set
++CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
++
++#
++# Media device types
++#
++CONFIG_MEDIA_CAMERA_SUPPORT=y
++CONFIG_MEDIA_ANALOG_TV_SUPPORT=y
++CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y
++CONFIG_MEDIA_RADIO_SUPPORT=y
++CONFIG_MEDIA_SDR_SUPPORT=y
++CONFIG_MEDIA_PLATFORM_SUPPORT=y
++CONFIG_MEDIA_TEST_SUPPORT=y
++# end of Media device types
++
++#
++# Media core support
++#
++CONFIG_VIDEO_DEV=y
++# CONFIG_MEDIA_CONTROLLER is not set
++CONFIG_DVB_CORE=y
++# end of Media core support
++
++#
++# Video4Linux options
++#
++CONFIG_VIDEO_V4L2=y
++CONFIG_VIDEO_V4L2_I2C=y
++# CONFIG_VIDEO_ADV_DEBUG is not set
++# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
++# end of Video4Linux options
++
++#
++# Digital TV options
++#
++# CONFIG_DVB_MMAP is not set
++CONFIG_DVB_NET=y
++CONFIG_DVB_MAX_ADAPTERS=16
++CONFIG_DVB_DYNAMIC_MINORS=y
++# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set
++# CONFIG_DVB_ULE_DEBUG is not set
++# end of Digital TV options
++
++#
++# Media drivers
++#
++CONFIG_MEDIA_USB_SUPPORT=y
++
++#
++# Webcam devices
++#
++CONFIG_USB_VIDEO_CLASS=y
++CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
++CONFIG_USB_GSPCA=m
++# CONFIG_USB_M5602 is not set
++# CONFIG_USB_STV06XX is not set
++# CONFIG_USB_GL860 is not set
++# CONFIG_USB_GSPCA_BENQ is not set
++# CONFIG_USB_GSPCA_CONEX is not set
++# CONFIG_USB_GSPCA_CPIA1 is not set
++# CONFIG_USB_GSPCA_DTCS033 is not set
++# CONFIG_USB_GSPCA_ETOMS is not set
++# CONFIG_USB_GSPCA_FINEPIX is not set
++# CONFIG_USB_GSPCA_JEILINJ is not set
++# CONFIG_USB_GSPCA_JL2005BCD is not set
++# CONFIG_USB_GSPCA_KINECT is not set
++# CONFIG_USB_GSPCA_KONICA is not set
++# CONFIG_USB_GSPCA_MARS is not set
++# CONFIG_USB_GSPCA_MR97310A is not set
++# CONFIG_USB_GSPCA_NW80X is not set
++# CONFIG_USB_GSPCA_OV519 is not set
++# CONFIG_USB_GSPCA_OV534 is not set
++# CONFIG_USB_GSPCA_OV534_9 is not set
++# CONFIG_USB_GSPCA_PAC207 is not set
++# CONFIG_USB_GSPCA_PAC7302 is not set
++# CONFIG_USB_GSPCA_PAC7311 is not set
++# CONFIG_USB_GSPCA_SE401 is not set
++# CONFIG_USB_GSPCA_SN9C2028 is not set
++# CONFIG_USB_GSPCA_SN9C20X is not set
++# CONFIG_USB_GSPCA_SONIXB is not set
++# CONFIG_USB_GSPCA_SONIXJ is not set
++# CONFIG_USB_GSPCA_SPCA500 is not set
++# CONFIG_USB_GSPCA_SPCA501 is not set
++# CONFIG_USB_GSPCA_SPCA505 is not set
++# CONFIG_USB_GSPCA_SPCA506 is not set
++# CONFIG_USB_GSPCA_SPCA508 is not set
++# CONFIG_USB_GSPCA_SPCA561 is not set
++# CONFIG_USB_GSPCA_SPCA1528 is not set
++# CONFIG_USB_GSPCA_SQ905 is not set
++# CONFIG_USB_GSPCA_SQ905C is not set
++# CONFIG_USB_GSPCA_SQ930X is not set
++# CONFIG_USB_GSPCA_STK014 is not set
++# CONFIG_USB_GSPCA_STK1135 is not set
++# CONFIG_USB_GSPCA_STV0680 is not set
++# CONFIG_USB_GSPCA_SUNPLUS is not set
++# CONFIG_USB_GSPCA_T613 is not set
++# CONFIG_USB_GSPCA_TOPRO is not set
++# CONFIG_USB_GSPCA_TOUPTEK is not set
++# CONFIG_USB_GSPCA_TV8532 is not set
++# CONFIG_USB_GSPCA_VC032X is not set
++# CONFIG_USB_GSPCA_VICAM is not set
++# CONFIG_USB_GSPCA_XIRLINK_CIT is not set
++# CONFIG_USB_GSPCA_ZC3XX is not set
++# CONFIG_USB_PWC is not set
++# CONFIG_VIDEO_CPIA2 is not set
++# CONFIG_USB_ZR364XX is not set
++# CONFIG_USB_STKWEBCAM is not set
++# CONFIG_USB_S2255 is not set
++# CONFIG_VIDEO_USBTV is not set
++
++#
++# Analog TV USB devices
++#
++# CONFIG_VIDEO_PVRUSB2 is not set
++# CONFIG_VIDEO_HDPVR is not set
++# CONFIG_VIDEO_STK1160_COMMON is not set
++# CONFIG_VIDEO_GO7007 is not set
++
++#
++# Analog/digital TV USB devices
++#
++# CONFIG_VIDEO_AU0828 is not set
++# CONFIG_VIDEO_CX231XX is not set
++
++#
++# Digital TV USB devices
++#
++# CONFIG_DVB_USB_V2 is not set
++# CONFIG_DVB_TTUSB_BUDGET is not set
++# CONFIG_DVB_TTUSB_DEC is not set
++# CONFIG_SMS_USB_DRV is not set
++# CONFIG_DVB_B2C2_FLEXCOP_USB is not set
++# CONFIG_DVB_AS102 is not set
++
++#
++# Webcam, TV (analog/digital) USB devices
++#
++# CONFIG_VIDEO_EM28XX is not set
++
++#
++# Software defined radio USB devices
++#
++# CONFIG_USB_AIRSPY is not set
++# CONFIG_USB_HACKRF is not set
++# CONFIG_USB_MSI2500 is not set
++# CONFIG_MEDIA_PCI_SUPPORT is not set
++CONFIG_RADIO_ADAPTERS=y
++# CONFIG_RADIO_SI470X is not set
++# CONFIG_RADIO_SI4713 is not set
++# CONFIG_USB_MR800 is not set
++# CONFIG_USB_DSBR is not set
++# CONFIG_RADIO_MAXIRADIO is not set
++# CONFIG_RADIO_SHARK is not set
++# CONFIG_RADIO_SHARK2 is not set
++# CONFIG_USB_KEENE is not set
++# CONFIG_USB_RAREMONO is not set
++# CONFIG_USB_MA901 is not set
++# CONFIG_RADIO_TEA5764 is not set
++# CONFIG_RADIO_SAA7706H is not set
++# CONFIG_RADIO_TEF6862 is not set
++# CONFIG_RADIO_WL1273 is not set
++CONFIG_VIDEOBUF2_CORE=y
++CONFIG_VIDEOBUF2_V4L2=y
++CONFIG_VIDEOBUF2_MEMOPS=y
++CONFIG_VIDEOBUF2_VMALLOC=y
++CONFIG_V4L_PLATFORM_DRIVERS=y
++# CONFIG_VIDEO_CAFE_CCIC is not set
++# CONFIG_VIDEO_CADENCE is not set
++# CONFIG_VIDEO_ASPEED is not set
++# CONFIG_VIDEO_MUX is not set
++# CONFIG_VIDEO_XILINX is not set
++# CONFIG_V4L_MEM2MEM_DRIVERS is not set
++# CONFIG_DVB_PLATFORM_DRIVERS is not set
++# CONFIG_SDR_PLATFORM_DRIVERS is not set
++
++#
++# MMC/SDIO DVB adapters
++#
++# CONFIG_SMS_SDIO_DRV is not set
++# CONFIG_V4L_TEST_DRIVERS is not set
++# CONFIG_DVB_TEST_DRIVERS is not set
++# end of Media drivers
++
++#
++# Media ancillary drivers
++#
++CONFIG_MEDIA_ATTACH=y
++
++#
++# Audio decoders, processors and mixers
++#
++# CONFIG_VIDEO_TVAUDIO is not set
++# CONFIG_VIDEO_TDA7432 is not set
++# CONFIG_VIDEO_TDA9840 is not set
++# CONFIG_VIDEO_TEA6415C is not set
++# CONFIG_VIDEO_TEA6420 is not set
++# CONFIG_VIDEO_MSP3400 is not set
++# CONFIG_VIDEO_CS3308 is not set
++# CONFIG_VIDEO_CS5345 is not set
++# CONFIG_VIDEO_CS53L32A is not set
++# CONFIG_VIDEO_TLV320AIC23B is not set
++# CONFIG_VIDEO_UDA1342 is not set
++# CONFIG_VIDEO_WM8775 is not set
++# CONFIG_VIDEO_WM8739 is not set
++# CONFIG_VIDEO_VP27SMPX is not set
++# CONFIG_VIDEO_SONY_BTF_MPX is not set
++# end of Audio decoders, processors and mixers
++
++#
++# RDS decoders
++#
++# CONFIG_VIDEO_SAA6588 is not set
++# end of RDS decoders
++
++#
++# Video decoders
++#
++# CONFIG_VIDEO_ADV7180 is not set
++# CONFIG_VIDEO_ADV7183 is not set
++# CONFIG_VIDEO_ADV748X is not set
++# CONFIG_VIDEO_ADV7604 is not set
++# CONFIG_VIDEO_ADV7842 is not set
++# CONFIG_VIDEO_BT819 is not set
++# CONFIG_VIDEO_BT856 is not set
++# CONFIG_VIDEO_BT866 is not set
++# CONFIG_VIDEO_KS0127 is not set
++# CONFIG_VIDEO_ML86V7667 is not set
++# CONFIG_VIDEO_SAA7110 is not set
++# CONFIG_VIDEO_SAA711X is not set
++# CONFIG_VIDEO_TC358743 is not set
++# CONFIG_VIDEO_TVP514X is not set
++# CONFIG_VIDEO_TVP5150 is not set
++# CONFIG_VIDEO_TVP7002 is not set
++# CONFIG_VIDEO_TW2804 is not set
++# CONFIG_VIDEO_TW9903 is not set
++# CONFIG_VIDEO_TW9906 is not set
++# CONFIG_VIDEO_TW9910 is not set
++# CONFIG_VIDEO_VPX3220 is not set
++# CONFIG_VIDEO_MAX9286 is not set
++
++#
++# Video and audio decoders
++#
++# CONFIG_VIDEO_SAA717X is not set
++# CONFIG_VIDEO_CX25840 is not set
++# end of Video decoders
++
++#
++# Video encoders
++#
++# CONFIG_VIDEO_SAA7127 is not set
++# CONFIG_VIDEO_SAA7185 is not set
++# CONFIG_VIDEO_ADV7170 is not set
++# CONFIG_VIDEO_ADV7175 is not set
++# CONFIG_VIDEO_ADV7343 is not set
++# CONFIG_VIDEO_ADV7393 is not set
++# CONFIG_VIDEO_ADV7511 is not set
++# CONFIG_VIDEO_AD9389B is not set
++# CONFIG_VIDEO_AK881X is not set
++# CONFIG_VIDEO_THS8200 is not set
++# end of Video encoders
++
++#
++# Video improvement chips
++#
++# CONFIG_VIDEO_UPD64031A is not set
++# CONFIG_VIDEO_UPD64083 is not set
++# end of Video improvement chips
++
++#
++# Audio/Video compression chips
++#
++# CONFIG_VIDEO_SAA6752HS is not set
++# end of Audio/Video compression chips
++
++#
++# SDR tuner chips
++#
++# CONFIG_SDR_MAX2175 is not set
++# end of SDR tuner chips
++
++#
++# Miscellaneous helper chips
++#
++# CONFIG_VIDEO_THS7303 is not set
++# CONFIG_VIDEO_M52790 is not set
++# CONFIG_VIDEO_I2C is not set
++# CONFIG_VIDEO_ST_MIPID02 is not set
++# end of Miscellaneous helper chips
++
++#
++# Camera sensor devices
++#
++# CONFIG_VIDEO_HI556 is not set
++# CONFIG_VIDEO_IMX214 is not set
++# CONFIG_VIDEO_IMX219 is not set
++# CONFIG_VIDEO_IMX258 is not set
++# CONFIG_VIDEO_IMX274 is not set
++# CONFIG_VIDEO_IMX290 is not set
++# CONFIG_VIDEO_IMX319 is not set
++# CONFIG_VIDEO_IMX355 is not set
++# CONFIG_VIDEO_OV2640 is not set
++# CONFIG_VIDEO_OV2659 is not set
++# CONFIG_VIDEO_OV2680 is not set
++# CONFIG_VIDEO_OV2685 is not set
++# CONFIG_VIDEO_OV5640 is not set
++# CONFIG_VIDEO_OV5645 is not set
++# CONFIG_VIDEO_OV5647 is not set
++# CONFIG_VIDEO_OV6650 is not set
++# CONFIG_VIDEO_OV5670 is not set
++# CONFIG_VIDEO_OV5675 is not set
++# CONFIG_VIDEO_OV5695 is not set
++# CONFIG_VIDEO_OV7251 is not set
++# CONFIG_VIDEO_OV772X is not set
++# CONFIG_VIDEO_OV7640 is not set
++# CONFIG_VIDEO_OV7670 is not set
++# CONFIG_VIDEO_OV7740 is not set
++# CONFIG_VIDEO_OV8856 is not set
++# CONFIG_VIDEO_OV9640 is not set
++# CONFIG_VIDEO_OV9650 is not set
++# CONFIG_VIDEO_OV13858 is not set
++# CONFIG_VIDEO_VS6624 is not set
++# CONFIG_VIDEO_MT9M001 is not set
++# CONFIG_VIDEO_MT9M032 is not set
++# CONFIG_VIDEO_MT9M111 is not set
++# CONFIG_VIDEO_MT9P031 is not set
++# CONFIG_VIDEO_MT9T001 is not set
++# CONFIG_VIDEO_MT9T112 is not set
++# CONFIG_VIDEO_MT9V011 is not set
++# CONFIG_VIDEO_MT9V032 is not set
++# CONFIG_VIDEO_MT9V111 is not set
++# CONFIG_VIDEO_SR030PC30 is not set
++# CONFIG_VIDEO_NOON010PC30 is not set
++# CONFIG_VIDEO_M5MOLS is not set
++# CONFIG_VIDEO_RDACM20 is not set
++# CONFIG_VIDEO_RJ54N1 is not set
++# CONFIG_VIDEO_S5K6AA is not set
++# CONFIG_VIDEO_S5K6A3 is not set
++# CONFIG_VIDEO_S5K4ECGX is not set
++# CONFIG_VIDEO_S5K5BAF is not set
++# CONFIG_VIDEO_SMIAPP is not set
++# CONFIG_VIDEO_ET8EK8 is not set
++# CONFIG_VIDEO_S5C73M3 is not set
++# end of Camera sensor devices
++
++#
++# Lens drivers
++#
++# CONFIG_VIDEO_AD5820 is not set
++# CONFIG_VIDEO_AK7375 is not set
++# CONFIG_VIDEO_DW9714 is not set
++# CONFIG_VIDEO_DW9768 is not set
++# CONFIG_VIDEO_DW9807_VCM is not set
++# end of Lens drivers
++
++#
++# Flash devices
++#
++# CONFIG_VIDEO_ADP1653 is not set
++# CONFIG_VIDEO_LM3560 is not set
++# CONFIG_VIDEO_LM3646 is not set
++# end of Flash devices
++
++#
++# SPI helper chips
++#
++# CONFIG_VIDEO_GS1662 is not set
++# end of SPI helper chips
++
++#
++# Media SPI Adapters
++#
++# CONFIG_CXD2880_SPI_DRV is not set
++# end of Media SPI Adapters
++
++CONFIG_MEDIA_TUNER=y
++
++#
++# Customize TV tuners
++#
++CONFIG_MEDIA_TUNER_SIMPLE=y
++# CONFIG_MEDIA_TUNER_TDA18250 is not set
++CONFIG_MEDIA_TUNER_TDA8290=y
++CONFIG_MEDIA_TUNER_TDA827X=y
++CONFIG_MEDIA_TUNER_TDA18271=y
++CONFIG_MEDIA_TUNER_TDA9887=y
++CONFIG_MEDIA_TUNER_TEA5761=y
++CONFIG_MEDIA_TUNER_TEA5767=y
++# CONFIG_MEDIA_TUNER_MSI001 is not set
++CONFIG_MEDIA_TUNER_MT20XX=y
++# CONFIG_MEDIA_TUNER_MT2060 is not set
++# CONFIG_MEDIA_TUNER_MT2063 is not set
++# CONFIG_MEDIA_TUNER_MT2266 is not set
++# CONFIG_MEDIA_TUNER_MT2131 is not set
++# CONFIG_MEDIA_TUNER_QT1010 is not set
++CONFIG_MEDIA_TUNER_XC2028=y
++CONFIG_MEDIA_TUNER_XC5000=y
++CONFIG_MEDIA_TUNER_XC4000=y
++# CONFIG_MEDIA_TUNER_MXL5005S is not set
++# CONFIG_MEDIA_TUNER_MXL5007T is not set
++CONFIG_MEDIA_TUNER_MC44S803=y
++# CONFIG_MEDIA_TUNER_MAX2165 is not set
++# CONFIG_MEDIA_TUNER_TDA18218 is not set
++# CONFIG_MEDIA_TUNER_FC0011 is not set
++# CONFIG_MEDIA_TUNER_FC0012 is not set
++# CONFIG_MEDIA_TUNER_FC0013 is not set
++# CONFIG_MEDIA_TUNER_TDA18212 is not set
++# CONFIG_MEDIA_TUNER_E4000 is not set
++# CONFIG_MEDIA_TUNER_FC2580 is not set
++# CONFIG_MEDIA_TUNER_M88RS6000T is not set
++# CONFIG_MEDIA_TUNER_TUA9001 is not set
++# CONFIG_MEDIA_TUNER_SI2157 is not set
++# CONFIG_MEDIA_TUNER_IT913X is not set
++# CONFIG_MEDIA_TUNER_R820T is not set
++# CONFIG_MEDIA_TUNER_MXL301RF is not set
++# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set
++# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set
++# end of Customize TV tuners
++
++#
++# Customise DVB Frontends
++#
++
++#
++# Multistandard (satellite) frontends
++#
++# CONFIG_DVB_STB0899 is not set
++# CONFIG_DVB_STB6100 is not set
++# CONFIG_DVB_STV090x is not set
++# CONFIG_DVB_STV0910 is not set
++# CONFIG_DVB_STV6110x is not set
++# CONFIG_DVB_STV6111 is not set
++# CONFIG_DVB_MXL5XX is not set
++# CONFIG_DVB_M88DS3103 is not set
++
++#
++# Multistandard (cable + terrestrial) frontends
++#
++# CONFIG_DVB_DRXK is not set
++# CONFIG_DVB_TDA18271C2DD is not set
++# CONFIG_DVB_SI2165 is not set
++# CONFIG_DVB_MN88472 is not set
++# CONFIG_DVB_MN88473 is not set
++
++#
++# DVB-S (satellite) frontends
++#
++# CONFIG_DVB_CX24110 is not set
++# CONFIG_DVB_CX24123 is not set
++# CONFIG_DVB_MT312 is not set
++# CONFIG_DVB_ZL10036 is not set
++# CONFIG_DVB_ZL10039 is not set
++# CONFIG_DVB_S5H1420 is not set
++# CONFIG_DVB_STV0288 is not set
++# CONFIG_DVB_STB6000 is not set
++# CONFIG_DVB_STV0299 is not set
++# CONFIG_DVB_STV6110 is not set
++# CONFIG_DVB_STV0900 is not set
++# CONFIG_DVB_TDA8083 is not set
++# CONFIG_DVB_TDA10086 is not set
++# CONFIG_DVB_TDA8261 is not set
++# CONFIG_DVB_VES1X93 is not set
++# CONFIG_DVB_TUNER_ITD1000 is not set
++# CONFIG_DVB_TUNER_CX24113 is not set
++# CONFIG_DVB_TDA826X is not set
++# CONFIG_DVB_TUA6100 is not set
++# CONFIG_DVB_CX24116 is not set
++# CONFIG_DVB_CX24117 is not set
++# CONFIG_DVB_CX24120 is not set
++# CONFIG_DVB_SI21XX is not set
++# CONFIG_DVB_TS2020 is not set
++# CONFIG_DVB_DS3000 is not set
++# CONFIG_DVB_MB86A16 is not set
++# CONFIG_DVB_TDA10071 is not set
++
++#
++# DVB-T (terrestrial) frontends
++#
++# CONFIG_DVB_SP8870 is not set
++# CONFIG_DVB_SP887X is not set
++# CONFIG_DVB_CX22700 is not set
++# CONFIG_DVB_CX22702 is not set
++# CONFIG_DVB_S5H1432 is not set
++# CONFIG_DVB_DRXD is not set
++# CONFIG_DVB_L64781 is not set
++# CONFIG_DVB_TDA1004X is not set
++# CONFIG_DVB_NXT6000 is not set
++# CONFIG_DVB_MT352 is not set
++# CONFIG_DVB_ZL10353 is not set
++# CONFIG_DVB_DIB3000MB is not set
++# CONFIG_DVB_DIB3000MC is not set
++# CONFIG_DVB_DIB7000M is not set
++# CONFIG_DVB_DIB7000P is not set
++# CONFIG_DVB_DIB9000 is not set
++# CONFIG_DVB_TDA10048 is not set
++# CONFIG_DVB_AF9013 is not set
++# CONFIG_DVB_EC100 is not set
++# CONFIG_DVB_STV0367 is not set
++# CONFIG_DVB_CXD2820R is not set
++# CONFIG_DVB_CXD2841ER is not set
++# CONFIG_DVB_RTL2830 is not set
++# CONFIG_DVB_RTL2832 is not set
++# CONFIG_DVB_RTL2832_SDR is not set
++# CONFIG_DVB_SI2168 is not set
++# CONFIG_DVB_ZD1301_DEMOD is not set
++# CONFIG_DVB_CXD2880 is not set
++
++#
++# DVB-C (cable) frontends
++#
++# CONFIG_DVB_VES1820 is not set
++# CONFIG_DVB_TDA10021 is not set
++# CONFIG_DVB_TDA10023 is not set
++# CONFIG_DVB_STV0297 is not set
++
++#
++# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
++#
++# CONFIG_DVB_NXT200X is not set
++# CONFIG_DVB_OR51211 is not set
++# CONFIG_DVB_OR51132 is not set
++# CONFIG_DVB_BCM3510 is not set
++# CONFIG_DVB_LGDT330X is not set
++# CONFIG_DVB_LGDT3305 is not set
++# CONFIG_DVB_LGDT3306A is not set
++# CONFIG_DVB_LG2160 is not set
++# CONFIG_DVB_S5H1409 is not set
++# CONFIG_DVB_AU8522_DTV is not set
++# CONFIG_DVB_AU8522_V4L is not set
++# CONFIG_DVB_S5H1411 is not set
++
++#
++# ISDB-T (terrestrial) frontends
++#
++# CONFIG_DVB_S921 is not set
++# CONFIG_DVB_DIB8000 is not set
++# CONFIG_DVB_MB86A20S is not set
++
++#
++# ISDB-S (satellite) & ISDB-T (terrestrial) frontends
++#
++# CONFIG_DVB_TC90522 is not set
++# CONFIG_DVB_MN88443X is not set
++
++#
++# Digital terrestrial only tuners/PLL
++#
++# CONFIG_DVB_PLL is not set
++# CONFIG_DVB_TUNER_DIB0070 is not set
++# CONFIG_DVB_TUNER_DIB0090 is not set
++
++#
++# SEC control devices for DVB-S
++#
++# CONFIG_DVB_DRX39XYJ is not set
++# CONFIG_DVB_LNBH25 is not set
++# CONFIG_DVB_LNBH29 is not set
++# CONFIG_DVB_LNBP21 is not set
++# CONFIG_DVB_LNBP22 is not set
++# CONFIG_DVB_ISL6405 is not set
++# CONFIG_DVB_ISL6421 is not set
++# CONFIG_DVB_ISL6423 is not set
++# CONFIG_DVB_A8293 is not set
++# CONFIG_DVB_LGS8GL5 is not set
++# CONFIG_DVB_LGS8GXX is not set
++# CONFIG_DVB_ATBM8830 is not set
++# CONFIG_DVB_TDA665x is not set
++# CONFIG_DVB_IX2505V is not set
++# CONFIG_DVB_M88RS2000 is not set
++# CONFIG_DVB_AF9033 is not set
++# CONFIG_DVB_HORUS3A is not set
++# CONFIG_DVB_ASCOT2E is not set
++# CONFIG_DVB_HELENE is not set
++
++#
++# Common Interface (EN50221) controller drivers
++#
++# CONFIG_DVB_CXD2099 is not set
++# CONFIG_DVB_SP2 is not set
++# end of Customise DVB Frontends
++
++#
++# Tools to develop new frontends
++#
++# CONFIG_DVB_DUMMY_FE is not set
++# end of Media ancillary drivers
++
++#
++# Graphics support
++#
++CONFIG_VGA_ARB=y
++CONFIG_VGA_ARB_MAX_GPUS=16
++# CONFIG_DRM is not set
++
++#
++# ARM devices
++#
++# end of ARM devices
++
++#
++# Frame buffer Devices
++#
++CONFIG_FB_CMDLINE=y
++CONFIG_FB_NOTIFY=y
++CONFIG_FB=y
++# CONFIG_FIRMWARE_EDID is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
++# CONFIG_FB_MODE_HELPERS is not set
++# CONFIG_FB_TILEBLITTING is not set
++
++#
++# Frame buffer hardware drivers
++#
++# CONFIG_FB_CIRRUS is not set
++# CONFIG_FB_PM2 is not set
++# CONFIG_FB_ARMCLCD is not set
++# CONFIG_FB_CYBER2000 is not set
++# CONFIG_FB_ASILIANT is not set
++# CONFIG_FB_IMSTT is not set
++# CONFIG_FB_OPENCORES is not set
++# CONFIG_FB_S1D13XXX is not set
++# CONFIG_FB_NVIDIA is not set
++# CONFIG_FB_RIVA is not set
++# CONFIG_FB_I740 is not set
++# CONFIG_FB_MATROX is not set
++# CONFIG_FB_RADEON is not set
++# CONFIG_FB_ATY128 is not set
++# CONFIG_FB_ATY is not set
++# CONFIG_FB_S3 is not set
++# CONFIG_FB_SAVAGE is not set
++# CONFIG_FB_SIS is not set
++# CONFIG_FB_NEOMAGIC is not set
++# CONFIG_FB_KYRO is not set
++# CONFIG_FB_3DFX is not set
++# CONFIG_FB_VOODOO1 is not set
++# CONFIG_FB_VT8623 is not set
++# CONFIG_FB_TRIDENT is not set
++# CONFIG_FB_ARK is not set
++# CONFIG_FB_PM3 is not set
++# CONFIG_FB_CARMINE is not set
++# CONFIG_FB_SMSCUFX is not set
++# CONFIG_FB_UDL is not set
++# CONFIG_FB_IBM_GXT4500 is not set
++# CONFIG_FB_VIRTUAL is not set
++# CONFIG_FB_METRONOME is not set
++# CONFIG_FB_MB862XX is not set
++# CONFIG_FB_SIMPLE is not set
++# CONFIG_FB_SSD1307 is not set
++# CONFIG_FB_SM712 is not set
++# end of Frame buffer Devices
++
++#
++# Backlight & LCD device support
++#
++# CONFIG_LCD_CLASS_DEVICE is not set
++# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
++# end of Backlight & LCD device support
++
++#
++# Console display driver support
++#
++CONFIG_DUMMY_CONSOLE=y
++CONFIG_DUMMY_CONSOLE_COLUMNS=80
++CONFIG_DUMMY_CONSOLE_ROWS=25
++# CONFIG_FRAMEBUFFER_CONSOLE is not set
++# end of Console display driver support
++
++# CONFIG_LOGO is not set
++# end of Graphics support
++
++CONFIG_SOUND=y
++CONFIG_SND=y
++CONFIG_SND_TIMER=y
++CONFIG_SND_PCM=y
++# CONFIG_SND_OSSEMUL is not set
++CONFIG_SND_PCM_TIMER=y
++# CONFIG_SND_HRTIMER is not set
++# CONFIG_SND_DYNAMIC_MINORS is not set
++CONFIG_SND_SUPPORT_OLD_API=y
++CONFIG_SND_PROC_FS=y
++CONFIG_SND_VERBOSE_PROCFS=y
++# CONFIG_SND_VERBOSE_PRINTK is not set
++# CONFIG_SND_DEBUG is not set
++# CONFIG_SND_SEQUENCER is not set
++CONFIG_SND_DRIVERS=y
++# CONFIG_SND_DUMMY is not set
++# CONFIG_SND_ALOOP is not set
++# CONFIG_SND_MTPAV is not set
++# CONFIG_SND_SERIAL_U16550 is not set
++# CONFIG_SND_MPU401 is not set
++CONFIG_SND_PCI=y
++# CONFIG_SND_AD1889 is not set
++# CONFIG_SND_ALS300 is not set
++# CONFIG_SND_ALI5451 is not set
++# CONFIG_SND_ATIIXP is not set
++# CONFIG_SND_ATIIXP_MODEM is not set
++# CONFIG_SND_AU8810 is not set
++# CONFIG_SND_AU8820 is not set
++# CONFIG_SND_AU8830 is not set
++# CONFIG_SND_AW2 is not set
++# CONFIG_SND_AZT3328 is not set
++# CONFIG_SND_BT87X is not set
++# CONFIG_SND_CA0106 is not set
++# CONFIG_SND_CMIPCI is not set
++# CONFIG_SND_OXYGEN is not set
++# CONFIG_SND_CS4281 is not set
++# CONFIG_SND_CS46XX is not set
++# CONFIG_SND_CTXFI is not set
++# CONFIG_SND_DARLA20 is not set
++# CONFIG_SND_GINA20 is not set
++# CONFIG_SND_LAYLA20 is not set
++# CONFIG_SND_DARLA24 is not set
++# CONFIG_SND_GINA24 is not set
++# CONFIG_SND_LAYLA24 is not set
++# CONFIG_SND_MONA is not set
++# CONFIG_SND_MIA is not set
++# CONFIG_SND_ECHO3G is not set
++# CONFIG_SND_INDIGO is not set
++# CONFIG_SND_INDIGOIO is not set
++# CONFIG_SND_INDIGODJ is not set
++# CONFIG_SND_INDIGOIOX is not set
++# CONFIG_SND_INDIGODJX is not set
++# CONFIG_SND_EMU10K1 is not set
++# CONFIG_SND_EMU10K1X is not set
++# CONFIG_SND_ENS1370 is not set
++# CONFIG_SND_ENS1371 is not set
++# CONFIG_SND_ES1938 is not set
++# CONFIG_SND_ES1968 is not set
++# CONFIG_SND_FM801 is not set
++# CONFIG_SND_HDSP is not set
++# CONFIG_SND_HDSPM is not set
++# CONFIG_SND_ICE1712 is not set
++# CONFIG_SND_ICE1724 is not set
++# CONFIG_SND_INTEL8X0 is not set
++# CONFIG_SND_INTEL8X0M is not set
++# CONFIG_SND_KORG1212 is not set
++# CONFIG_SND_LOLA is not set
++# CONFIG_SND_LX6464ES is not set
++# CONFIG_SND_MAESTRO3 is not set
++# CONFIG_SND_MIXART is not set
++# CONFIG_SND_NM256 is not set
++# CONFIG_SND_PCXHR is not set
++# CONFIG_SND_RIPTIDE is not set
++# CONFIG_SND_RME32 is not set
++# CONFIG_SND_RME96 is not set
++# CONFIG_SND_RME9652 is not set
++# CONFIG_SND_SE6X is not set
++# CONFIG_SND_SONICVIBES is not set
++# CONFIG_SND_TRIDENT is not set
++# CONFIG_SND_VIA82XX is not set
++# CONFIG_SND_VIA82XX_MODEM is not set
++# CONFIG_SND_VIRTUOSO is not set
++# CONFIG_SND_VX222 is not set
++# CONFIG_SND_YMFPCI is not set
++
++#
++# HD-Audio
++#
++# CONFIG_SND_HDA_INTEL is not set
++# end of HD-Audio
++
++CONFIG_SND_HDA_PREALLOC_SIZE=64
++CONFIG_SND_SPI=y
++CONFIG_SND_USB=y
++# CONFIG_SND_USB_AUDIO is not set
++# CONFIG_SND_USB_UA101 is not set
++# CONFIG_SND_USB_CAIAQ is not set
++# CONFIG_SND_USB_6FIRE is not set
++# CONFIG_SND_USB_HIFACE is not set
++# CONFIG_SND_BCD2000 is not set
++# CONFIG_SND_USB_POD is not set
++# CONFIG_SND_USB_PODHD is not set
++# CONFIG_SND_USB_TONEPORT is not set
++# CONFIG_SND_USB_VARIAX is not set
++# CONFIG_SND_SOC is not set
++
++#
++# HID support
++#
++CONFIG_HID=y
++# CONFIG_HID_BATTERY_STRENGTH is not set
++# CONFIG_HIDRAW is not set
++# CONFIG_UHID is not set
++CONFIG_HID_GENERIC=y
++
++#
++# Special HID drivers
++#
++CONFIG_HID_A4TECH=y
++# CONFIG_HID_ACCUTOUCH is not set
++# CONFIG_HID_ACRUX is not set
++CONFIG_HID_APPLE=y
++# CONFIG_HID_APPLEIR is not set
++# CONFIG_HID_AUREAL is not set
++CONFIG_HID_BELKIN=y
++# CONFIG_HID_BETOP_FF is not set
++CONFIG_HID_CHERRY=y
++CONFIG_HID_CHICONY=y
++# CONFIG_HID_COUGAR is not set
++# CONFIG_HID_MACALLY is not set
++# CONFIG_HID_PRODIKEYS is not set
++# CONFIG_HID_CMEDIA is not set
++# CONFIG_HID_CREATIVE_SB0540 is not set
++CONFIG_HID_CYPRESS=y
++# CONFIG_HID_DRAGONRISE is not set
++# CONFIG_HID_EMS_FF is not set
++# CONFIG_HID_ELECOM is not set
++# CONFIG_HID_ELO is not set
++CONFIG_HID_EZKEY=y
++# CONFIG_HID_GEMBIRD is not set
++# CONFIG_HID_GFRM is not set
++# CONFIG_HID_GLORIOUS is not set
++# CONFIG_HID_HOLTEK is not set
++# CONFIG_HID_VIVALDI is not set
++# CONFIG_HID_KEYTOUCH is not set
++# CONFIG_HID_KYE is not set
++# CONFIG_HID_UCLOGIC is not set
++# CONFIG_HID_WALTOP is not set
++# CONFIG_HID_VIEWSONIC is not set
++# CONFIG_HID_GYRATION is not set
++# CONFIG_HID_ICADE is not set
++# CONFIG_HID_ITE is not set
++# CONFIG_HID_JABRA is not set
++# CONFIG_HID_TWINHAN is not set
++CONFIG_HID_KENSINGTON=y
++# CONFIG_HID_LCPOWER is not set
++# CONFIG_HID_LENOVO is not set
++# CONFIG_HID_MAGICMOUSE is not set
++# CONFIG_HID_MALTRON is not set
++# CONFIG_HID_MAYFLASH is not set
++# CONFIG_HID_REDRAGON is not set
++CONFIG_HID_MICROSOFT=y
++CONFIG_HID_MONTEREY=y
++# CONFIG_HID_MULTITOUCH is not set
++# CONFIG_HID_NTI is not set
++# CONFIG_HID_NTRIG is not set
++# CONFIG_HID_ORTEK is not set
++# CONFIG_HID_PANTHERLORD is not set
++# CONFIG_HID_PENMOUNT is not set
++# CONFIG_HID_PETALYNX is not set
++# CONFIG_HID_PICOLCD is not set
++# CONFIG_HID_PLANTRONICS is not set
++# CONFIG_HID_PRIMAX is not set
++# CONFIG_HID_RETRODE is not set
++# CONFIG_HID_ROCCAT is not set
++# CONFIG_HID_SAITEK is not set
++# CONFIG_HID_SAMSUNG is not set
++# CONFIG_HID_SPEEDLINK is not set
++# CONFIG_HID_STEAM is not set
++# CONFIG_HID_STEELSERIES is not set
++# CONFIG_HID_SUNPLUS is not set
++# CONFIG_HID_RMI is not set
++# CONFIG_HID_GREENASIA is not set
++# CONFIG_HID_SMARTJOYPLUS is not set
++# CONFIG_HID_TIVO is not set
++# CONFIG_HID_TOPSEED is not set
++# CONFIG_HID_THRUSTMASTER is not set
++# CONFIG_HID_UDRAW_PS3 is not set
++# CONFIG_HID_WACOM is not set
++# CONFIG_HID_XINMO is not set
++# CONFIG_HID_ZEROPLUS is not set
++# CONFIG_HID_ZYDACRON is not set
++# CONFIG_HID_SENSOR_HUB is not set
++# CONFIG_HID_ALPS is not set
++# CONFIG_HID_MCP2221 is not set
++# end of Special HID drivers
++
++#
++# USB HID support
++#
++CONFIG_USB_HID=y
++# CONFIG_HID_PID is not set
++# CONFIG_USB_HIDDEV is not set
++# end of USB HID support
++
++#
++# I2C HID support
++#
++# CONFIG_I2C_HID is not set
++# end of I2C HID support
++# end of HID support
++
++CONFIG_USB_OHCI_LITTLE_ENDIAN=y
++CONFIG_USB_SUPPORT=y
++CONFIG_USB_COMMON=y
++# CONFIG_USB_ULPI_BUS is not set
++# CONFIG_USB_CONN_GPIO is not set
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB=y
++CONFIG_USB_PCI=y
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
++
++#
++# Miscellaneous USB options
++#
++CONFIG_USB_DEFAULT_PERSIST=y
++# CONFIG_USB_FEW_INIT_RETRIES is not set
++# CONFIG_USB_DYNAMIC_MINORS is not set
++CONFIG_USB_OTG=y
++CONFIG_USB_OTG_PRODUCTLIST=y
++# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set
++# CONFIG_USB_OTG_FSM is not set
++CONFIG_USB_AUTOSUSPEND_DELAY=2
++# CONFIG_USB_MON is not set
++
++#
++# USB Host Controller Drivers
++#
++# CONFIG_USB_C67X00_HCD is not set
++CONFIG_USB_XHCI_HCD=y
++# CONFIG_USB_XHCI_DBGCAP is not set
++CONFIG_USB_XHCI_PCI=y
++# CONFIG_USB_XHCI_PCI_RENESAS is not set
++CONFIG_USB_XHCI_PLATFORM=y
++# CONFIG_USB_EHCI_HCD is not set
++# CONFIG_USB_OXU210HP_HCD is not set
++# CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_FOTG210_HCD is not set
++# CONFIG_USB_MAX3421_HCD is not set
++# CONFIG_USB_OHCI_HCD is not set
++# CONFIG_USB_UHCI_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++# CONFIG_USB_HCD_TEST_MODE is not set
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
++CONFIG_USB_WDM=y
++# CONFIG_USB_TMC is not set
++
++#
++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
++#
++
++#
++# also be needed; see USB_STORAGE Help for more info
++#
++CONFIG_USB_STORAGE=y
++# CONFIG_USB_STORAGE_DEBUG is not set
++# CONFIG_USB_STORAGE_REALTEK is not set
++# CONFIG_USB_STORAGE_DATAFAB is not set
++# CONFIG_USB_STORAGE_FREECOM is not set
++# CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_USBAT is not set
++# CONFIG_USB_STORAGE_SDDR09 is not set
++# CONFIG_USB_STORAGE_SDDR55 is not set
++# CONFIG_USB_STORAGE_JUMPSHOT is not set
++# CONFIG_USB_STORAGE_ALAUDA is not set
++# CONFIG_USB_STORAGE_ONETOUCH is not set
++# CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
++# CONFIG_USB_STORAGE_ENE_UB6250 is not set
++CONFIG_USB_UAS=y
++
++#
++# USB Imaging devices
++#
++# CONFIG_USB_MDC800 is not set
++# CONFIG_USB_MICROTEK is not set
++CONFIG_USBIP_CORE=y
++CONFIG_USBIP_VHCI_HCD=y
++CONFIG_USBIP_VHCI_HC_PORTS=8
++CONFIG_USBIP_VHCI_NR_HCS=1
++CONFIG_USBIP_HOST=y
++CONFIG_USBIP_VUDC=y
++CONFIG_USBIP_DEBUG=y
++# CONFIG_USB_CDNS3 is not set
++# CONFIG_USB_MUSB_HDRC is not set
++CONFIG_USB_DWC3=y
++# CONFIG_USB_DWC3_HOST is not set
++CONFIG_USB_DWC3_GADGET=y
++
++#
++# Platform Glue Driver Support
++#
++# CONFIG_USB_DWC3_HAPS is not set
++# CONFIG_USB_DWC3_OF_SIMPLE is not set
++# CONFIG_USB_DWC2 is not set
++# CONFIG_USB_CHIPIDEA is not set
++# CONFIG_USB_ISP1760 is not set
++
++#
++# USB port drivers
++#
++CONFIG_USB_SERIAL=y
++CONFIG_USB_SERIAL_CONSOLE=y
++CONFIG_USB_SERIAL_GENERIC=y
++# CONFIG_USB_SERIAL_SIMPLE is not set
++# CONFIG_USB_SERIAL_AIRCABLE is not set
++# CONFIG_USB_SERIAL_ARK3116 is not set
++# CONFIG_USB_SERIAL_BELKIN is not set
++CONFIG_USB_SERIAL_CH341=y
++# CONFIG_USB_SERIAL_WHITEHEAT is not set
++# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
++CONFIG_USB_SERIAL_CP210X=y
++# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
++# CONFIG_USB_SERIAL_EMPEG is not set
++# CONFIG_USB_SERIAL_FTDI_SIO is not set
++# CONFIG_USB_SERIAL_VISOR is not set
++# CONFIG_USB_SERIAL_IPAQ is not set
++# CONFIG_USB_SERIAL_IR is not set
++# CONFIG_USB_SERIAL_EDGEPORT is not set
++# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
++# CONFIG_USB_SERIAL_F81232 is not set
++# CONFIG_USB_SERIAL_F8153X is not set
++# CONFIG_USB_SERIAL_GARMIN is not set
++# CONFIG_USB_SERIAL_IPW is not set
++# CONFIG_USB_SERIAL_IUU is not set
++# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
++# CONFIG_USB_SERIAL_KEYSPAN is not set
++# CONFIG_USB_SERIAL_KLSI is not set
++# CONFIG_USB_SERIAL_KOBIL_SCT is not set
++# CONFIG_USB_SERIAL_MCT_U232 is not set
++# CONFIG_USB_SERIAL_METRO is not set
++# CONFIG_USB_SERIAL_MOS7720 is not set
++# CONFIG_USB_SERIAL_MOS7840 is not set
++# CONFIG_USB_SERIAL_MXUPORT is not set
++# CONFIG_USB_SERIAL_NAVMAN is not set
++# CONFIG_USB_SERIAL_PL2303 is not set
++# CONFIG_USB_SERIAL_OTI6858 is not set
++# CONFIG_USB_SERIAL_QCAUX is not set
++# CONFIG_USB_SERIAL_QUALCOMM is not set
++# CONFIG_USB_SERIAL_SPCP8X5 is not set
++# CONFIG_USB_SERIAL_SAFE is not set
++# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
++# CONFIG_USB_SERIAL_SYMBOL is not set
++# CONFIG_USB_SERIAL_TI is not set
++# CONFIG_USB_SERIAL_CYBERJACK is not set
++# CONFIG_USB_SERIAL_XIRCOM is not set
++CONFIG_USB_SERIAL_WWAN=y
++CONFIG_USB_SERIAL_OPTION=y
++# CONFIG_USB_SERIAL_OMNINET is not set
++# CONFIG_USB_SERIAL_OPTICON is not set
++# CONFIG_USB_SERIAL_XSENS_MT is not set
++# CONFIG_USB_SERIAL_WISHBONE is not set
++# CONFIG_USB_SERIAL_SSU100 is not set
++# CONFIG_USB_SERIAL_QT2 is not set
++# CONFIG_USB_SERIAL_UPD78F0730 is not set
++# CONFIG_USB_SERIAL_DEBUG is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_SEVSEG is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_APPLE_MFI_FASTCHARGE is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
++# CONFIG_USB_TEST is not set
++# CONFIG_USB_EHSET_TEST_FIXTURE is not set
++# CONFIG_USB_ISIGHTFW is not set
++# CONFIG_USB_YUREX is not set
++# CONFIG_USB_EZUSB_FX2 is not set
++# CONFIG_USB_HUB_USB251XB is not set
++# CONFIG_USB_HSIC_USB3503 is not set
++# CONFIG_USB_HSIC_USB4604 is not set
++# CONFIG_USB_LINK_LAYER_TEST is not set
++
++#
++# USB Physical Layer drivers
++#
++# CONFIG_NOP_USB_XCEIV is not set
++# CONFIG_USB_GPIO_VBUS is not set
++# CONFIG_USB_ISP1301 is not set
++# CONFIG_USB_ULPI is not set
++# end of USB Physical Layer drivers
++
++CONFIG_USB_GADGET=y
++# CONFIG_USB_GADGET_DEBUG is not set
++# CONFIG_USB_GADGET_DEBUG_FILES is not set
++# CONFIG_USB_GADGET_DEBUG_FS is not set
++CONFIG_USB_GADGET_VBUS_DRAW=2
++CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
++# CONFIG_U_SERIAL_CONSOLE is not set
++
++#
++# USB Peripheral Controller
++#
++# CONFIG_USB_FOTG210_UDC is not set
++# CONFIG_USB_GR_UDC is not set
++# CONFIG_USB_R8A66597 is not set
++# CONFIG_USB_PXA27X is not set
++# CONFIG_USB_MV_UDC is not set
++# CONFIG_USB_MV_U3D is not set
++# CONFIG_USB_SNP_UDC_PLAT is not set
++# CONFIG_USB_M66592 is not set
++# CONFIG_USB_BDC_UDC is not set
++# CONFIG_USB_AMD5536UDC is not set
++# CONFIG_USB_NET2272 is not set
++# CONFIG_USB_NET2280 is not set
++# CONFIG_USB_GOKU is not set
++# CONFIG_USB_EG20T is not set
++# CONFIG_USB_GADGET_XILINX is not set
++# CONFIG_USB_MAX3420_UDC is not set
++# CONFIG_USB_DUMMY_HCD is not set
++# end of USB Peripheral Controller
++
++CONFIG_USB_LIBCOMPOSITE=y
++CONFIG_USB_F_ACM=y
++CONFIG_USB_U_SERIAL=y
++CONFIG_USB_U_ETHER=y
++CONFIG_USB_U_AUDIO=y
++CONFIG_USB_F_NCM=y
++CONFIG_USB_F_ECM=y
++CONFIG_USB_F_EEM=y
++CONFIG_USB_F_SUBSET=y
++CONFIG_USB_F_RNDIS=y
++CONFIG_USB_F_MASS_STORAGE=y
++CONFIG_USB_F_FS=y
++CONFIG_USB_F_UAC1=y
++CONFIG_USB_F_UVC=y
++CONFIG_USB_F_HID=y
++CONFIG_USB_CONFIGFS=y
++# CONFIG_USB_CONFIGFS_SERIAL is not set
++CONFIG_USB_CONFIGFS_ACM=y
++# CONFIG_USB_CONFIGFS_OBEX is not set
++CONFIG_USB_CONFIGFS_NCM=y
++CONFIG_USB_CONFIGFS_ECM=y
++CONFIG_USB_CONFIGFS_ECM_SUBSET=y
++CONFIG_USB_CONFIGFS_RNDIS=y
++CONFIG_USB_CONFIGFS_EEM=y
++CONFIG_USB_CONFIGFS_MASS_STORAGE=y
++# CONFIG_USB_CONFIGFS_F_LB_SS is not set
++# CONFIG_USB_CONFIGFS_F_FS is not set
++CONFIG_USB_CONFIGFS_F_UAC1=y
++# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set
++# CONFIG_USB_CONFIGFS_F_UAC2 is not set
++# CONFIG_USB_CONFIGFS_F_MIDI is not set
++# CONFIG_USB_CONFIGFS_F_HID is not set
++CONFIG_USB_CONFIGFS_F_UVC=y
++# CONFIG_USB_CONFIGFS_F_PRINTER is not set
++
++#
++# USB Gadget precomposed configurations
++#
++# CONFIG_USB_ZERO is not set
++# CONFIG_USB_AUDIO is not set
++CONFIG_USB_ETH=y
++CONFIG_USB_ETH_RNDIS=y
++CONFIG_USB_ETH_EEM=y
++CONFIG_USB_G_NCM=y
++CONFIG_USB_GADGETFS=y
++CONFIG_USB_FUNCTIONFS=y
++CONFIG_USB_FUNCTIONFS_ETH=y
++CONFIG_USB_FUNCTIONFS_RNDIS=y
++# CONFIG_USB_FUNCTIONFS_GENERIC is not set
++# CONFIG_USB_MASS_STORAGE is not set
++# CONFIG_USB_G_SERIAL is not set
++# CONFIG_USB_MIDI_GADGET is not set
++# CONFIG_USB_G_PRINTER is not set
++CONFIG_USB_CDC_COMPOSITE=y
++CONFIG_USB_G_ACM_MS=y
++CONFIG_USB_G_MULTI=y
++CONFIG_USB_G_MULTI_RNDIS=y
++CONFIG_USB_G_MULTI_CDC=y
++CONFIG_USB_G_HID=y
++# CONFIG_USB_G_DBGP is not set
++# CONFIG_USB_G_WEBCAM is not set
++# CONFIG_USB_RAW_GADGET is not set
++# end of USB Gadget precomposed configurations
++
++CONFIG_MPP_TO_GADGET_UVC=y
++# CONFIG_TYPEC is not set
++# CONFIG_USB_ROLE_SWITCH is not set
++CONFIG_MMC=y
++CONFIG_PWRSEQ_EMMC=y
++CONFIG_PWRSEQ_SIMPLE=y
++CONFIG_MMC_BLOCK=y
++CONFIG_MMC_BLOCK_MINORS=8
++# CONFIG_SDIO_UART is not set
++# CONFIG_MMC_TEST is not set
++
++#
++# MMC/SD/SDIO Host Controller Drivers
++#
++# CONFIG_MMC_DEBUG is not set
++# CONFIG_MMC_ARMMMCI is not set
++CONFIG_MMC_SDHCI=y
++CONFIG_MMC_SDHCI_IO_ACCESSORS=y
++CONFIG_MMC_SDHCI_PCI=y
++CONFIG_MMC_RICOH_MMC=y
++CONFIG_MMC_SDHCI_PLTFM=y
++CONFIG_MMC_SDHCI_OF_ARASAN=y
++CONFIG_MMC_SDHCI_OF_ASPEED=y
++CONFIG_MMC_SDHCI_OF_AT91=y
++CONFIG_MMC_SDHCI_OF_DWCMSHC=y
++CONFIG_MMC_SDHCI_CADENCE=y
++CONFIG_MMC_SDHCI_F_SDH30=m
++CONFIG_MMC_SDHCI_MILBEAUT=m
++# CONFIG_MMC_TIFM_SD is not set
++# CONFIG_MMC_SPI is not set
++# CONFIG_MMC_CB710 is not set
++# CONFIG_MMC_VIA_SDMMC is not set
++# CONFIG_MMC_DW is not set
++# CONFIG_MMC_VUB300 is not set
++# CONFIG_MMC_USHC is not set
++# CONFIG_MMC_USDHI6ROL0 is not set
++CONFIG_MMC_CQHCI=y
++# CONFIG_MMC_HSQ is not set
++# CONFIG_MMC_TOSHIBA_PCI is not set
++# CONFIG_MMC_MTK is not set
++# CONFIG_MMC_SDHCI_XENON is not set
++# CONFIG_MMC_SDHCI_OMAP is not set
++# CONFIG_MMC_SDHCI_AM654 is not set
++CONFIG_MMC_SDHCI_SS928V100=y
++# CONFIG_MEMSTICK is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_ACCESSIBILITY is not set
++# CONFIG_INFINIBAND is not set
++CONFIG_EDAC_SUPPORT=y
++CONFIG_RTC_LIB=y
++CONFIG_RTC_CLASS=y
++CONFIG_RTC_HCTOSYS=y
++CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
++CONFIG_RTC_SYSTOHC=y
++CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
++# CONFIG_RTC_DEBUG is not set
++CONFIG_RTC_NVMEM=y
++
++#
++# RTC interfaces
++#
++CONFIG_RTC_INTF_SYSFS=y
++CONFIG_RTC_INTF_PROC=y
++CONFIG_RTC_INTF_DEV=y
++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
++# CONFIG_RTC_DRV_TEST is not set
++
++#
++# I2C RTC drivers
++#
++# CONFIG_RTC_DRV_ABB5ZES3 is not set
++# CONFIG_RTC_DRV_ABEOZ9 is not set
++# CONFIG_RTC_DRV_ABX80X is not set
++# CONFIG_RTC_DRV_DS1307 is not set
++# CONFIG_RTC_DRV_DS1374 is not set
++# CONFIG_RTC_DRV_DS1672 is not set
++# CONFIG_RTC_DRV_HYM8563 is not set
++# CONFIG_RTC_DRV_MAX6900 is not set
++# CONFIG_RTC_DRV_RS5C372 is not set
++# CONFIG_RTC_DRV_ISL1208 is not set
++# CONFIG_RTC_DRV_ISL12022 is not set
++# CONFIG_RTC_DRV_ISL12026 is not set
++# CONFIG_RTC_DRV_X1205 is not set
++# CONFIG_RTC_DRV_PCF8523 is not set
++# CONFIG_RTC_DRV_PCF85063 is not set
++# CONFIG_RTC_DRV_PCF85363 is not set
++CONFIG_RTC_DRV_PCF8563=y
++# CONFIG_RTC_DRV_PCF8583 is not set
++# CONFIG_RTC_DRV_M41T80 is not set
++# CONFIG_RTC_DRV_BQ32K is not set
++# CONFIG_RTC_DRV_S35390A is not set
++# CONFIG_RTC_DRV_FM3130 is not set
++# CONFIG_RTC_DRV_RX8010 is not set
++# CONFIG_RTC_DRV_RX8581 is not set
++# CONFIG_RTC_DRV_RX8025 is not set
++# CONFIG_RTC_DRV_EM3027 is not set
++# CONFIG_RTC_DRV_RV3028 is not set
++# CONFIG_RTC_DRV_RV3032 is not set
++CONFIG_RTC_DRV_RV8803=y
++# CONFIG_RTC_DRV_SD3078 is not set
++
++#
++# SPI RTC drivers
++#
++# CONFIG_RTC_DRV_M41T93 is not set
++# CONFIG_RTC_DRV_M41T94 is not set
++# CONFIG_RTC_DRV_DS1302 is not set
++# CONFIG_RTC_DRV_DS1305 is not set
++# CONFIG_RTC_DRV_DS1343 is not set
++# CONFIG_RTC_DRV_DS1347 is not set
++# CONFIG_RTC_DRV_DS1390 is not set
++# CONFIG_RTC_DRV_MAX6916 is not set
++# CONFIG_RTC_DRV_R9701 is not set
++# CONFIG_RTC_DRV_RX4581 is not set
++# CONFIG_RTC_DRV_RX6110 is not set
++# CONFIG_RTC_DRV_RS5C348 is not set
++# CONFIG_RTC_DRV_MAX6902 is not set
++# CONFIG_RTC_DRV_PCF2123 is not set
++# CONFIG_RTC_DRV_MCP795 is not set
++CONFIG_RTC_I2C_AND_SPI=y
++
++#
++# SPI and I2C RTC drivers
++#
++# CONFIG_RTC_DRV_DS3232 is not set
++# CONFIG_RTC_DRV_PCF2127 is not set
++# CONFIG_RTC_DRV_RV3029C2 is not set
++
++#
++# Platform RTC drivers
++#
++# CONFIG_RTC_DRV_DS1286 is not set
++# CONFIG_RTC_DRV_DS1511 is not set
++# CONFIG_RTC_DRV_DS1553 is not set
++# CONFIG_RTC_DRV_DS1685_FAMILY is not set
++# CONFIG_RTC_DRV_DS1742 is not set
++# CONFIG_RTC_DRV_DS2404 is not set
++# CONFIG_RTC_DRV_STK17TA8 is not set
++# CONFIG_RTC_DRV_M48T86 is not set
++# CONFIG_RTC_DRV_M48T35 is not set
++# CONFIG_RTC_DRV_M48T59 is not set
++# CONFIG_RTC_DRV_MSM6242 is not set
++# CONFIG_RTC_DRV_BQ4802 is not set
++# CONFIG_RTC_DRV_RP5C01 is not set
++# CONFIG_RTC_DRV_V3020 is not set
++# CONFIG_RTC_DRV_ZYNQMP is not set
++
++#
++# on-CPU RTC drivers
++#
++# CONFIG_RTC_DRV_PL030 is not set
++# CONFIG_RTC_DRV_PL031 is not set
++# CONFIG_RTC_DRV_CADENCE is not set
++# CONFIG_RTC_DRV_FTRTC010 is not set
++# CONFIG_RTC_DRV_R7301 is not set
++
++#
++# HID Sensor RTC drivers
++#
++CONFIG_DMADEVICES=y
++# CONFIG_DMADEVICES_DEBUG is not set
++
++#
++# DMA Devices
++#
++CONFIG_DMA_ENGINE=y
++CONFIG_DMA_OF=y
++# CONFIG_ALTERA_MSGDMA is not set
++# CONFIG_AMBA_PL08X is not set
++# CONFIG_DW_AXI_DMAC is not set
++# CONFIG_FSL_EDMA is not set
++# CONFIG_FSL_QDMA is not set
++# CONFIG_HISI_DMA is not set
++# CONFIG_INTEL_IDMA64 is not set
++# CONFIG_MV_XOR_V2 is not set
++# CONFIG_PL330_DMA is not set
++# CONFIG_PLX_DMA is not set
++# CONFIG_XILINX_DMA is not set
++# CONFIG_XILINX_ZYNQMP_DMA is not set
++# CONFIG_XILINX_ZYNQMP_DPDMA is not set
++# CONFIG_QCOM_HIDMA_MGMT is not set
++# CONFIG_QCOM_HIDMA is not set
++# CONFIG_DW_DMAC is not set
++# CONFIG_DW_DMAC_PCI is not set
++# CONFIG_DW_EDMA is not set
++# CONFIG_DW_EDMA_PCIE is not set
++# CONFIG_SF_PDMA is not set
++
++#
++# DMA Clients
++#
++# CONFIG_ASYNC_TX_DMA is not set
++# CONFIG_DMATEST is not set
++
++#
++# DMABUF options
++#
++# CONFIG_SYNC_FILE is not set
++# CONFIG_UDMABUF is not set
++# CONFIG_DMABUF_MOVE_NOTIFY is not set
++# CONFIG_DMABUF_SELFTESTS is not set
++# CONFIG_DMABUF_HEAPS is not set
++# end of DMABUF options
++
++# CONFIG_AUXDISPLAY is not set
++# CONFIG_UIO is not set
++# CONFIG_VFIO is not set
++# CONFIG_VIRT_DRIVERS is not set
++# CONFIG_VIRTIO_MENU is not set
++# CONFIG_VDPA is not set
++CONFIG_VHOST_MENU=y
++# CONFIG_VHOST_NET is not set
++# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set
++
++#
++# Microsoft Hyper-V guest support
++#
++# end of Microsoft Hyper-V guest support
++
++# CONFIG_GREYBUS is not set
++# CONFIG_STAGING is not set
++# CONFIG_GOLDFISH is not set
++# CONFIG_CHROME_PLATFORMS is not set
++# CONFIG_MELLANOX_PLATFORM is not set
++CONFIG_LOONGARCH_PLATFORM_DEVICES=y
++CONFIG_HAVE_CLK=y
++CONFIG_CLKDEV_LOOKUP=y
++CONFIG_HAVE_CLK_PREPARE=y
++CONFIG_COMMON_CLK=y
++# CONFIG_COMMON_CLK_MAX9485 is not set
++# CONFIG_COMMON_CLK_SI5341 is not set
++# CONFIG_COMMON_CLK_SI5351 is not set
++# CONFIG_COMMON_CLK_SI514 is not set
++# CONFIG_COMMON_CLK_SI544 is not set
++# CONFIG_COMMON_CLK_SI570 is not set
++# CONFIG_COMMON_CLK_CDCE706 is not set
++# CONFIG_COMMON_CLK_CDCE925 is not set
++# CONFIG_COMMON_CLK_CS2000_CP is not set
++# CONFIG_CLK_QORIQ is not set
++# CONFIG_COMMON_CLK_XGENE is not set
++# CONFIG_COMMON_CLK_PWM is not set
++# CONFIG_COMMON_CLK_VC5 is not set
++# CONFIG_COMMON_CLK_FIXED_MMIO is not set
++CONFIG_RESET_BSP=y
++CONFIG_COMMON_CLK_SS928V100=y
++# CONFIG_HWSPINLOCK is not set
++
++#
++# Clock Source drivers
++#
++CONFIG_TIMER_OF=y
++CONFIG_TIMER_PROBE=y
++CONFIG_CLKSRC_MMIO=y
++CONFIG_ARM_ARCH_TIMER=y
++CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
++CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y
++# CONFIG_FSL_ERRATUM_A008585 is not set
++CONFIG_HISILICON_ERRATUM_161010101=y
++CONFIG_ARM64_ERRATUM_858921=y
++CONFIG_ARM_TIMER_SP804=y
++# CONFIG_MICROCHIP_PIT64B is not set
++# end of Clock Source drivers
++
++# CONFIG_MAILBOX is not set
++CONFIG_IOMMU_IOVA=y
++CONFIG_IOASID=y
++CONFIG_IOMMU_API=y
++CONFIG_IOMMU_SUPPORT=y
++
++#
++# Generic IOMMU Pagetable Support
++#
++CONFIG_IOMMU_IO_PGTABLE=y
++CONFIG_IOMMU_IO_PGTABLE_LPAE=y
++# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set
++# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set
++
++#
++# Generic PASID table support
++#
++CONFIG_IOMMU_PASID_TABLE=y
++CONFIG_ARM_SMMU_V3_CONTEXT=y
++# end of Generic PASID table support
++# end of Generic IOMMU Pagetable Support
++
++# CONFIG_IOMMU_DEBUGFS is not set
++# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
++CONFIG_OF_IOMMU=y
++CONFIG_IOMMU_DMA=y
++CONFIG_IOMMU_SVA_LIB=y
++CONFIG_IOMMU_PAGE_FAULT=y
++# CONFIG_ARM_SMMU is not set
++CONFIG_ARM_SMMU_V3=y
++CONFIG_ARM_SMMU_V3_SVA=y
++
++#
++# Remoteproc drivers
++#
++# CONFIG_REMOTEPROC is not set
++# end of Remoteproc drivers
++
++#
++# Rpmsg drivers
++#
++# CONFIG_RPMSG_VIRTIO is not set
++# end of Rpmsg drivers
++
++# CONFIG_SOUNDWIRE is not set
++
++#
++# SOC (System On Chip) specific Drivers
++#
++
++#
++# Amlogic SoC drivers
++#
++# end of Amlogic SoC drivers
++
++#
++# Aspeed SoC drivers
++#
++# end of Aspeed SoC drivers
++
++#
++# Broadcom SoC drivers
++#
++# CONFIG_SOC_BRCMSTB is not set
++# end of Broadcom SoC drivers
++
++#
++# NXP/Freescale QorIQ SoC drivers
++#
++# CONFIG_QUICC_ENGINE is not set
++# CONFIG_FSL_RCPM is not set
++# end of NXP/Freescale QorIQ SoC drivers
++
++#
++# i.MX SoC drivers
++#
++# end of i.MX SoC drivers
++
++#
++# Qualcomm SoC drivers
++#
++# end of Qualcomm SoC drivers
++
++# CONFIG_SOC_TI is not set
++
++#
++# Xilinx SoC drivers
++#
++# CONFIG_XILINX_VCU is not set
++# end of Xilinx SoC drivers
++
++#
++# Hisilicon SoC driver support
++#
++# end of Hisilicon SoC driver support
++# end of SOC (System On Chip) specific Drivers
++
++CONFIG_PM_DEVFREQ=y
++
++#
++# DEVFREQ Governors
++#
++CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
++# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set
++# CONFIG_DEVFREQ_GOV_POWERSAVE is not set
++# CONFIG_DEVFREQ_GOV_USERSPACE is not set
++# CONFIG_DEVFREQ_GOV_PASSIVE is not set
++
++#
++# DEVFREQ Drivers
++#
++# CONFIG_PM_DEVFREQ_EVENT is not set
++# CONFIG_EXTCON is not set
++# CONFIG_MEMORY is not set
++CONFIG_IIO=y
++# CONFIG_IIO_BUFFER is not set
++# CONFIG_IIO_CONFIGFS is not set
++# CONFIG_IIO_TRIGGER is not set
++# CONFIG_IIO_SW_DEVICE is not set
++# CONFIG_IIO_SW_TRIGGER is not set
++# CONFIG_IIO_TRIGGERED_EVENT is not set
++
++#
++# Accelerometers
++#
++# CONFIG_ADIS16201 is not set
++# CONFIG_ADIS16209 is not set
++# CONFIG_ADXL345_I2C is not set
++# CONFIG_ADXL345_SPI is not set
++# CONFIG_ADXL372_SPI is not set
++# CONFIG_ADXL372_I2C is not set
++# CONFIG_BMA180 is not set
++# CONFIG_BMA220 is not set
++# CONFIG_BMA400 is not set
++# CONFIG_BMC150_ACCEL is not set
++# CONFIG_DA280 is not set
++# CONFIG_DA311 is not set
++# CONFIG_DMARD06 is not set
++# CONFIG_DMARD09 is not set
++# CONFIG_DMARD10 is not set
++# CONFIG_IIO_ST_ACCEL_3AXIS is not set
++# CONFIG_KXSD9 is not set
++# CONFIG_KXCJK1013 is not set
++# CONFIG_MC3230 is not set
++# CONFIG_MMA7455_I2C is not set
++# CONFIG_MMA7455_SPI is not set
++# CONFIG_MMA7660 is not set
++# CONFIG_MMA8452 is not set
++# CONFIG_MMA9551 is not set
++# CONFIG_MMA9553 is not set
++# CONFIG_MXC4005 is not set
++# CONFIG_MXC6255 is not set
++# CONFIG_SCA3000 is not set
++# CONFIG_STK8312 is not set
++# CONFIG_STK8BA50 is not set
++# end of Accelerometers
++
++#
++# Analog to digital converters
++#
++# CONFIG_AD7091R5 is not set
++# CONFIG_AD7124 is not set
++# CONFIG_AD7192 is not set
++# CONFIG_AD7266 is not set
++# CONFIG_AD7291 is not set
++# CONFIG_AD7292 is not set
++# CONFIG_AD7298 is not set
++# CONFIG_AD7476 is not set
++# CONFIG_AD7606_IFACE_PARALLEL is not set
++# CONFIG_AD7606_IFACE_SPI is not set
++# CONFIG_AD7766 is not set
++# CONFIG_AD7768_1 is not set
++# CONFIG_AD7780 is not set
++# CONFIG_AD7791 is not set
++# CONFIG_AD7793 is not set
++# CONFIG_AD7887 is not set
++# CONFIG_AD7923 is not set
++# CONFIG_AD7949 is not set
++# CONFIG_AD799X is not set
++# CONFIG_ADI_AXI_ADC is not set
++# CONFIG_CC10001_ADC is not set
++# CONFIG_ENVELOPE_DETECTOR is not set
++# CONFIG_HI8435 is not set
++CONFIG_VENDOR_LSADC=y
++# CONFIG_HX711 is not set
++# CONFIG_INA2XX_ADC is not set
++# CONFIG_LTC2471 is not set
++# CONFIG_LTC2485 is not set
++# CONFIG_LTC2496 is not set
++# CONFIG_LTC2497 is not set
++# CONFIG_MAX1027 is not set
++# CONFIG_MAX11100 is not set
++# CONFIG_MAX1118 is not set
++# CONFIG_MAX1241 is not set
++# CONFIG_MAX1363 is not set
++# CONFIG_MAX9611 is not set
++# CONFIG_MCP320X is not set
++# CONFIG_MCP3422 is not set
++# CONFIG_MCP3911 is not set
++# CONFIG_NAU7802 is not set
++# CONFIG_SD_ADC_MODULATOR is not set
++# CONFIG_TI_ADC081C is not set
++# CONFIG_TI_ADC0832 is not set
++# CONFIG_TI_ADC084S021 is not set
++# CONFIG_TI_ADC12138 is not set
++# CONFIG_TI_ADC108S102 is not set
++# CONFIG_TI_ADC128S052 is not set
++# CONFIG_TI_ADC161S626 is not set
++# CONFIG_TI_ADS1015 is not set
++# CONFIG_TI_ADS7950 is not set
++# CONFIG_TI_ADS8344 is not set
++# CONFIG_TI_ADS8688 is not set
++# CONFIG_TI_ADS124S08 is not set
++# CONFIG_TI_TLC4541 is not set
++# CONFIG_VF610_ADC is not set
++# CONFIG_XILINX_XADC is not set
++# end of Analog to digital converters
++
++#
++# Analog Front Ends
++#
++# CONFIG_IIO_RESCALE is not set
++# end of Analog Front Ends
++
++#
++# Amplifiers
++#
++# CONFIG_AD8366 is not set
++# CONFIG_HMC425 is not set
++# end of Amplifiers
++
++#
++# Chemical Sensors
++#
++# CONFIG_ATLAS_PH_SENSOR is not set
++# CONFIG_ATLAS_EZO_SENSOR is not set
++# CONFIG_BME680 is not set
++# CONFIG_CCS811 is not set
++# CONFIG_IAQCORE is not set
++# CONFIG_SCD30_CORE is not set
++# CONFIG_SENSIRION_SGP30 is not set
++# CONFIG_SPS30 is not set
++# CONFIG_VZ89X is not set
++# end of Chemical Sensors
++
++#
++# Hid Sensor IIO Common
++#
++# end of Hid Sensor IIO Common
++
++#
++# SSP Sensor Common
++#
++# CONFIG_IIO_SSP_SENSORHUB is not set
++# end of SSP Sensor Common
++
++#
++# Digital to analog converters
++#
++# CONFIG_AD5064 is not set
++# CONFIG_AD5360 is not set
++# CONFIG_AD5380 is not set
++# CONFIG_AD5421 is not set
++# CONFIG_AD5446 is not set
++# CONFIG_AD5449 is not set
++# CONFIG_AD5592R is not set
++# CONFIG_AD5593R is not set
++# CONFIG_AD5504 is not set
++# CONFIG_AD5624R_SPI is not set
++# CONFIG_AD5686_SPI is not set
++# CONFIG_AD5696_I2C is not set
++# CONFIG_AD5755 is not set
++# CONFIG_AD5758 is not set
++# CONFIG_AD5761 is not set
++# CONFIG_AD5764 is not set
++# CONFIG_AD5770R is not set
++# CONFIG_AD5791 is not set
++# CONFIG_AD7303 is not set
++# CONFIG_AD8801 is not set
++# CONFIG_DPOT_DAC is not set
++# CONFIG_DS4424 is not set
++# CONFIG_LTC1660 is not set
++# CONFIG_LTC2632 is not set
++# CONFIG_M62332 is not set
++# CONFIG_MAX517 is not set
++# CONFIG_MAX5821 is not set
++# CONFIG_MCP4725 is not set
++# CONFIG_MCP4922 is not set
++# CONFIG_TI_DAC082S085 is not set
++# CONFIG_TI_DAC5571 is not set
++# CONFIG_TI_DAC7311 is not set
++# CONFIG_TI_DAC7612 is not set
++# CONFIG_VF610_DAC is not set
++# end of Digital to analog converters
++
++#
++# IIO dummy driver
++#
++# end of IIO dummy driver
++
++#
++# Frequency Synthesizers DDS/PLL
++#
++
++#
++# Clock Generator/Distribution
++#
++# CONFIG_AD9523 is not set
++# end of Clock Generator/Distribution
++
++#
++# Phase-Locked Loop (PLL) frequency synthesizers
++#
++# CONFIG_ADF4350 is not set
++# CONFIG_ADF4371 is not set
++# end of Phase-Locked Loop (PLL) frequency synthesizers
++# end of Frequency Synthesizers DDS/PLL
++
++#
++# Digital gyroscope sensors
++#
++# CONFIG_ADIS16080 is not set
++# CONFIG_ADIS16130 is not set
++# CONFIG_ADIS16136 is not set
++# CONFIG_ADIS16260 is not set
++# CONFIG_ADXRS290 is not set
++# CONFIG_ADXRS450 is not set
++# CONFIG_BMG160 is not set
++# CONFIG_FXAS21002C is not set
++# CONFIG_MPU3050_I2C is not set
++# CONFIG_IIO_ST_GYRO_3AXIS is not set
++# CONFIG_ITG3200 is not set
++# end of Digital gyroscope sensors
++
++#
++# Health Sensors
++#
++
++#
++# Heart Rate Monitors
++#
++# CONFIG_AFE4403 is not set
++# CONFIG_AFE4404 is not set
++# CONFIG_MAX30100 is not set
++# CONFIG_MAX30102 is not set
++# end of Heart Rate Monitors
++# end of Health Sensors
++
++#
++# Humidity sensors
++#
++# CONFIG_AM2315 is not set
++# CONFIG_DHT11 is not set
++# CONFIG_HDC100X is not set
++# CONFIG_HDC2010 is not set
++# CONFIG_HTS221 is not set
++# CONFIG_HTU21 is not set
++# CONFIG_SI7005 is not set
++# CONFIG_SI7020 is not set
++# end of Humidity sensors
++
++#
++# Inertial measurement units
++#
++# CONFIG_ADIS16400 is not set
++# CONFIG_ADIS16460 is not set
++# CONFIG_ADIS16475 is not set
++# CONFIG_ADIS16480 is not set
++# CONFIG_BMI160_I2C is not set
++# CONFIG_BMI160_SPI is not set
++# CONFIG_FXOS8700_I2C is not set
++# CONFIG_FXOS8700_SPI is not set
++# CONFIG_KMX61 is not set
++# CONFIG_INV_ICM42600_I2C is not set
++# CONFIG_INV_ICM42600_SPI is not set
++# CONFIG_INV_MPU6050_I2C is not set
++# CONFIG_INV_MPU6050_SPI is not set
++# CONFIG_IIO_ST_LSM6DSX is not set
++# end of Inertial measurement units
++
++#
++# Light sensors
++#
++# CONFIG_ADJD_S311 is not set
++# CONFIG_ADUX1020 is not set
++# CONFIG_AL3010 is not set
++# CONFIG_AL3320A is not set
++# CONFIG_APDS9300 is not set
++# CONFIG_APDS9960 is not set
++# CONFIG_AS73211 is not set
++# CONFIG_BH1750 is not set
++# CONFIG_BH1780 is not set
++# CONFIG_CM32181 is not set
++# CONFIG_CM3232 is not set
++# CONFIG_CM3323 is not set
++# CONFIG_CM3605 is not set
++# CONFIG_CM36651 is not set
++# CONFIG_GP2AP002 is not set
++# CONFIG_GP2AP020A00F is not set
++# CONFIG_SENSORS_ISL29018 is not set
++# CONFIG_SENSORS_ISL29028 is not set
++# CONFIG_ISL29125 is not set
++# CONFIG_JSA1212 is not set
++# CONFIG_RPR0521 is not set
++# CONFIG_LTR501 is not set
++# CONFIG_LV0104CS is not set
++# CONFIG_MAX44000 is not set
++# CONFIG_MAX44009 is not set
++# CONFIG_NOA1305 is not set
++# CONFIG_OPT3001 is not set
++# CONFIG_PA12203001 is not set
++# CONFIG_SI1133 is not set
++# CONFIG_SI1145 is not set
++# CONFIG_STK3310 is not set
++# CONFIG_ST_UVIS25 is not set
++# CONFIG_TCS3414 is not set
++# CONFIG_TCS3472 is not set
++# CONFIG_SENSORS_TSL2563 is not set
++# CONFIG_TSL2583 is not set
++# CONFIG_TSL2772 is not set
++# CONFIG_TSL4531 is not set
++# CONFIG_US5182D is not set
++# CONFIG_VCNL4000 is not set
++# CONFIG_VCNL4035 is not set
++# CONFIG_VEML6030 is not set
++# CONFIG_VEML6070 is not set
++# CONFIG_VL6180 is not set
++# CONFIG_ZOPT2201 is not set
++# end of Light sensors
++
++#
++# Magnetometer sensors
++#
++# CONFIG_AK8974 is not set
++# CONFIG_AK8975 is not set
++# CONFIG_AK09911 is not set
++# CONFIG_BMC150_MAGN_I2C is not set
++# CONFIG_BMC150_MAGN_SPI is not set
++# CONFIG_MAG3110 is not set
++# CONFIG_MMC35240 is not set
++# CONFIG_IIO_ST_MAGN_3AXIS is not set
++# CONFIG_SENSORS_HMC5843_I2C is not set
++# CONFIG_SENSORS_HMC5843_SPI is not set
++# CONFIG_SENSORS_RM3100_I2C is not set
++# CONFIG_SENSORS_RM3100_SPI is not set
++# end of Magnetometer sensors
++
++#
++# Multiplexers
++#
++# CONFIG_IIO_MUX is not set
++# end of Multiplexers
++
++#
++# Inclinometer sensors
++#
++# end of Inclinometer sensors
++
++#
++# Linear and angular position sensors
++#
++# end of Linear and angular position sensors
++
++#
++# Digital potentiometers
++#
++# CONFIG_AD5272 is not set
++# CONFIG_DS1803 is not set
++# CONFIG_MAX5432 is not set
++# CONFIG_MAX5481 is not set
++# CONFIG_MAX5487 is not set
++# CONFIG_MCP4018 is not set
++# CONFIG_MCP4131 is not set
++# CONFIG_MCP4531 is not set
++# CONFIG_MCP41010 is not set
++# CONFIG_TPL0102 is not set
++# end of Digital potentiometers
++
++#
++# Digital potentiostats
++#
++# CONFIG_LMP91000 is not set
++# end of Digital potentiostats
++
++#
++# Pressure sensors
++#
++# CONFIG_ABP060MG is not set
++# CONFIG_BMP280 is not set
++# CONFIG_DLHL60D is not set
++# CONFIG_DPS310 is not set
++# CONFIG_HP03 is not set
++# CONFIG_ICP10100 is not set
++# CONFIG_MPL115_I2C is not set
++# CONFIG_MPL115_SPI is not set
++# CONFIG_MPL3115 is not set
++# CONFIG_MS5611 is not set
++# CONFIG_MS5637 is not set
++# CONFIG_IIO_ST_PRESS is not set
++# CONFIG_T5403 is not set
++# CONFIG_HP206C is not set
++# CONFIG_ZPA2326 is not set
++# end of Pressure sensors
++
++#
++# Lightning sensors
++#
++# CONFIG_AS3935 is not set
++# end of Lightning sensors
++
++#
++# Proximity and distance sensors
++#
++# CONFIG_ISL29501 is not set
++# CONFIG_LIDAR_LITE_V2 is not set
++# CONFIG_MB1232 is not set
++# CONFIG_PING is not set
++# CONFIG_RFD77402 is not set
++# CONFIG_SRF04 is not set
++# CONFIG_SX9310 is not set
++# CONFIG_SX9500 is not set
++# CONFIG_SRF08 is not set
++# CONFIG_VCNL3020 is not set
++# CONFIG_VL53L0X_I2C is not set
++# end of Proximity and distance sensors
++
++#
++# Resolver to digital converters
++#
++# CONFIG_AD2S90 is not set
++# CONFIG_AD2S1200 is not set
++# end of Resolver to digital converters
++
++#
++# Temperature sensors
++#
++# CONFIG_LTC2983 is not set
++# CONFIG_MAXIM_THERMOCOUPLE is not set
++# CONFIG_MLX90614 is not set
++# CONFIG_MLX90632 is not set
++# CONFIG_TMP006 is not set
++# CONFIG_TMP007 is not set
++# CONFIG_TSYS01 is not set
++# CONFIG_TSYS02D is not set
++# CONFIG_MAX31856 is not set
++# end of Temperature sensors
++
++# CONFIG_NTB is not set
++# CONFIG_VME_BUS is not set
++CONFIG_PWM=y
++CONFIG_PWM_SYSFS=y
++# CONFIG_PWM_DEBUG is not set
++# CONFIG_PWM_FSL_FTM is not set
++# CONFIG_PWM_PCA9685 is not set
++CONFIG_PWM_BSP=y
++
++#
++# IRQ chip support
++#
++CONFIG_IRQCHIP=y
++CONFIG_ARM_GIC=y
++CONFIG_ARM_GIC_MAX_NR=1
++CONFIG_ARM_GIC_V2M=y
++CONFIG_ARM_GIC_V3=y
++CONFIG_ARM_GIC_V3_ITS=y
++CONFIG_ARM_GIC_V3_ITS_PCI=y
++# CONFIG_AL_FIC is not set
++CONFIG_HISILICON_IRQ_MBIGEN=y
++CONFIG_PARTITION_PERCPU=y
++# end of IRQ chip support
++
++# CONFIG_IPACK_BUS is not set
++CONFIG_RESET_CONTROLLER=y
++# CONFIG_RESET_TI_SYSCON is not set
++
++#
++# PHY Subsystem
++#
++CONFIG_GENERIC_PHY=y
++# CONFIG_PHY_XGENE is not set
++# CONFIG_BCM_KONA_USB2_PHY is not set
++# CONFIG_PHY_CADENCE_TORRENT is not set
++# CONFIG_PHY_CADENCE_DPHY is not set
++# CONFIG_PHY_CADENCE_SIERRA is not set
++# CONFIG_PHY_CADENCE_SALVO is not set
++# CONFIG_PHY_FSL_IMX8MQ_USB is not set
++# CONFIG_PHY_MIXEL_MIPI_DPHY is not set
++# CONFIG_PHY_PXA_28NM_HSIC is not set
++# CONFIG_PHY_PXA_28NM_USB2 is not set
++# CONFIG_PHY_CPCAP_USB is not set
++# CONFIG_PHY_MAPPHONE_MDM6600 is not set
++# CONFIG_PHY_OCELOT_SERDES is not set
++CONFIG_VENDOR_USB_PHY=y
++CONFIG_PHY_BSP_USB3=y
++CONFIG_BSP_USB_PHY=y
++CONFIG_USB_MODE_OPTION=y
++CONFIG_USB_DRD0_IN_HOST=y
++# end of PHY Subsystem
++
++# CONFIG_POWERCAP is not set
++# CONFIG_MCB is not set
++
++#
++# Performance monitor support
++#
++# CONFIG_ARM_CCI_PMU is not set
++# CONFIG_ARM_CCN is not set
++# CONFIG_ARM_CMN is not set
++CONFIG_ARM_PMU=y
++# CONFIG_ARM_DSU_PMU is not set
++# CONFIG_ARM_SPE_PMU is not set
++# CONFIG_HISI_PCIE_PMU is not set
++# CONFIG_HNS3_PMU is not set
++# end of Performance monitor support
++
++# CONFIG_RAS is not set
++# CONFIG_USB4 is not set
++
++#
++# Android
++#
++# CONFIG_ANDROID is not set
++# end of Android
++
++#
++# Vendor Hooks
++#
++# end of Vendor Hooks
++
++# CONFIG_LIBNVDIMM is not set
++# CONFIG_DAX is not set
++CONFIG_NVMEM=y
++CONFIG_NVMEM_SYSFS=y
++
++#
++# HW tracing support
++#
++# CONFIG_STM is not set
++# CONFIG_INTEL_TH is not set
++# CONFIG_HISI_PTT is not set
++# end of HW tracing support
++
++# CONFIG_FPGA is not set
++# CONFIG_FSI is not set
++# CONFIG_TEE is not set
++CONFIG_PM_OPP=y
++# CONFIG_SIOX is not set
++# CONFIG_SLIMBUS is not set
++# CONFIG_INTERCONNECT is not set
++# CONFIG_COUNTER is not set
++# CONFIG_MOST is not set
++# CONFIG_ROH is not set
++
++#
++# Vendor driver support
++#
++# CONFIG_CMA_MEM_SHARED is not set
++# CONFIG_CMA_ADVANCE_SHARE is not set
++CONFIG_VENDOR_NPU=y
++# end of Vendor driver support
++# end of Device Drivers
++
++#
++# File systems
++#
++CONFIG_DCACHE_WORD_ACCESS=y
++# CONFIG_VALIDATE_FS_PARSER is not set
++CONFIG_FS_IOMAP=y
++# CONFIG_EXT2_FS is not set
++# CONFIG_EXT3_FS is not set
++CONFIG_EXT4_FS=y
++CONFIG_EXT4_USE_FOR_EXT2=y
++CONFIG_EXT4_FS_POSIX_ACL=y
++CONFIG_EXT4_FS_SECURITY=y
++# CONFIG_EXT4_DEBUG is not set
++# CONFIG_EXT4_MITIGATION_FALSE_SHARING is not set
++CONFIG_JBD2=y
++# CONFIG_JBD2_DEBUG is not set
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++CONFIG_XFS_FS=y
++CONFIG_XFS_SUPPORT_V4=y
++CONFIG_XFS_QUOTA=y
++CONFIG_XFS_POSIX_ACL=y
++CONFIG_XFS_RT=y
++# CONFIG_XFS_ONLINE_SCRUB is not set
++# CONFIG_XFS_WARN is not set
++# CONFIG_XFS_DEBUG is not set
++# CONFIG_GFS2_FS is not set
++# CONFIG_OCFS2_FS is not set
++# CONFIG_BTRFS_FS is not set
++# CONFIG_NILFS2_FS is not set
++# CONFIG_F2FS_FS is not set
++# CONFIG_FS_DAX is not set
++CONFIG_FS_POSIX_ACL=y
++CONFIG_EXPORTFS=y
++# CONFIG_EXPORTFS_BLOCK_OPS is not set
++CONFIG_FILE_LOCKING=y
++CONFIG_MANDATORY_FILE_LOCKING=y
++# CONFIG_FS_ENCRYPTION is not set
++# CONFIG_FS_VERITY is not set
++CONFIG_FSNOTIFY=y
++CONFIG_DNOTIFY=y
++CONFIG_INOTIFY_USER=y
++# CONFIG_FANOTIFY is not set
++CONFIG_QUOTA=y
++# CONFIG_QUOTA_NETLINK_INTERFACE is not set
++CONFIG_PRINT_QUOTA_WARNING=y
++# CONFIG_QUOTA_DEBUG is not set
++CONFIG_QUOTA_TREE=m
++CONFIG_QFMT_V1=m
++CONFIG_QFMT_V2=m
++CONFIG_QUOTACTL=y
++CONFIG_AUTOFS4_FS=m
++CONFIG_AUTOFS_FS=m
++CONFIG_FUSE_FS=y
++# CONFIG_CUSE is not set
++# CONFIG_VIRTIO_FS is not set
++CONFIG_OVERLAY_FS=m
++CONFIG_OVERLAY_FS_REDIRECT_DIR=y
++CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y
++CONFIG_OVERLAY_FS_INDEX=y
++# CONFIG_OVERLAY_FS_XINO_AUTO is not set
++CONFIG_OVERLAY_FS_METACOPY=y
++
++#
++# Caches
++#
++# CONFIG_FSCACHE is not set
++# end of Caches
++
++#
++# CD-ROM/DVD Filesystems
++#
++CONFIG_ISO9660_FS=y
++# CONFIG_JOLIET is not set
++# CONFIG_ZISOFS is not set
++CONFIG_UDF_FS=y
++# end of CD-ROM/DVD Filesystems
++
++#
++# DOS/FAT/EXFAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++CONFIG_VFAT_FS=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++# CONFIG_FAT_DEFAULT_UTF8 is not set
++# CONFIG_EXFAT_FS is not set
++# CONFIG_NTFS_FS is not set
++# CONFIG_NTFS3_FS is not set
++# end of DOS/FAT/EXFAT/NT Filesystems
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++# CONFIG_PROC_KCORE is not set
++CONFIG_PROC_SYSCTL=y
++CONFIG_PROC_PAGE_MONITOR=y
++# CONFIG_PROC_CHILDREN is not set
++CONFIG_KERNFS=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++CONFIG_TMPFS_POSIX_ACL=y
++CONFIG_TMPFS_XATTR=y
++# CONFIG_TMPFS_INODE64 is not set
++# CONFIG_HUGETLBFS is not set
++CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
++CONFIG_MEMFD_CREATE=y
++CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
++CONFIG_CONFIGFS_FS=y
++# end of Pseudo filesystems
++
++CONFIG_MISC_FILESYSTEMS=y
++# CONFIG_ORANGEFS_FS is not set
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_ECRYPT_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++CONFIG_CRAMFS=y
++CONFIG_CRAMFS_BLOCKDEV=y
++CONFIG_SQUASHFS=y
++CONFIG_SQUASHFS_FILE_CACHE=y
++# CONFIG_SQUASHFS_FILE_DIRECT is not set
++CONFIG_SQUASHFS_DECOMP_SINGLE=y
++# CONFIG_SQUASHFS_DECOMP_MULTI is not set
++# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set
++# CONFIG_SQUASHFS_XATTR is not set
++CONFIG_SQUASHFS_ZLIB=y
++# CONFIG_SQUASHFS_LZ4 is not set
++CONFIG_SQUASHFS_LZO=y
++CONFIG_SQUASHFS_XZ=y
++# CONFIG_SQUASHFS_ZSTD is not set
++# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
++# CONFIG_SQUASHFS_EMBEDDED is not set
++CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
++# CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_OMFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_QNX6FS_FS is not set
++# CONFIG_ROMFS_FS is not set
++# CONFIG_PSTORE is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++# CONFIG_EROFS_FS is not set
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V2=y
++CONFIG_NFS_V3=y
++CONFIG_NFS_V3_ACL=y
++# CONFIG_NFS_V4 is not set
++CONFIG_NFS_DISABLE_UDP_SUPPORT=y
++# CONFIG_NFSD is not set
++CONFIG_GRACE_PERIOD=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_ACL_SUPPORT=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_DEBUG is not set
++# CONFIG_CEPH_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_SMB_SERVER is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=y
++CONFIG_NLS_CODEPAGE_737=m
++CONFIG_NLS_CODEPAGE_775=m
++CONFIG_NLS_CODEPAGE_850=m
++CONFIG_NLS_CODEPAGE_852=m
++CONFIG_NLS_CODEPAGE_855=m
++CONFIG_NLS_CODEPAGE_857=m
++CONFIG_NLS_CODEPAGE_860=m
++CONFIG_NLS_CODEPAGE_861=m
++CONFIG_NLS_CODEPAGE_862=m
++CONFIG_NLS_CODEPAGE_863=m
++CONFIG_NLS_CODEPAGE_864=m
++CONFIG_NLS_CODEPAGE_865=m
++CONFIG_NLS_CODEPAGE_866=m
++CONFIG_NLS_CODEPAGE_869=m
++CONFIG_NLS_CODEPAGE_936=y
++CONFIG_NLS_CODEPAGE_950=m
++CONFIG_NLS_CODEPAGE_932=m
++CONFIG_NLS_CODEPAGE_949=m
++CONFIG_NLS_CODEPAGE_874=m
++CONFIG_NLS_ISO8859_8=m
++CONFIG_NLS_CODEPAGE_1250=m
++CONFIG_NLS_CODEPAGE_1251=m
++CONFIG_NLS_ASCII=y
++CONFIG_NLS_ISO8859_1=y
++CONFIG_NLS_ISO8859_2=m
++CONFIG_NLS_ISO8859_3=m
++CONFIG_NLS_ISO8859_4=m
++CONFIG_NLS_ISO8859_5=m
++CONFIG_NLS_ISO8859_6=m
++CONFIG_NLS_ISO8859_7=m
++CONFIG_NLS_ISO8859_9=m
++CONFIG_NLS_ISO8859_13=m
++CONFIG_NLS_ISO8859_14=m
++CONFIG_NLS_ISO8859_15=m
++CONFIG_NLS_KOI8_R=m
++CONFIG_NLS_KOI8_U=m
++# CONFIG_NLS_MAC_ROMAN is not set
++# CONFIG_NLS_MAC_CELTIC is not set
++# CONFIG_NLS_MAC_CENTEURO is not set
++# CONFIG_NLS_MAC_CROATIAN is not set
++# CONFIG_NLS_MAC_CYRILLIC is not set
++# CONFIG_NLS_MAC_GAELIC is not set
++# CONFIG_NLS_MAC_GREEK is not set
++# CONFIG_NLS_MAC_ICELAND is not set
++# CONFIG_NLS_MAC_INUIT is not set
++# CONFIG_NLS_MAC_ROMANIAN is not set
++# CONFIG_NLS_MAC_TURKISH is not set
++CONFIG_NLS_UTF8=y
++# CONFIG_DLM is not set
++# CONFIG_UNICODE is not set
++CONFIG_IO_WQ=y
++# end of File systems
++
++#
++# Security options
++#
++CONFIG_KEYS=y
++# CONFIG_KEYS_REQUEST_CACHE is not set
++# CONFIG_PERSISTENT_KEYRINGS is not set
++# CONFIG_ENCRYPTED_KEYS is not set
++# CONFIG_KEY_DH_OPERATIONS is not set
++# CONFIG_SECURITY_DMESG_RESTRICT is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITYFS is not set
++CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
++# CONFIG_HARDENED_USERCOPY is not set
++# CONFIG_FORTIFY_SOURCE is not set
++# CONFIG_STATIC_USERMODEHELPER is not set
++CONFIG_DEFAULT_SECURITY_DAC=y
++CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf"
++
++#
++# Kernel hardening options
++#
++
++#
++# 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_GCC_PLUGIN_STACKLEAK is not set
++# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
++# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
++# end of Memory initialization
++# end of Kernel hardening options
++
++# CONFIG_SECURITY_BOOT_INIT is not set
++# end of Security options
++
++CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_ALGAPI2=y
++CONFIG_CRYPTO_AEAD=y
++CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_SKCIPHER=y
++CONFIG_CRYPTO_SKCIPHER2=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_HASH2=y
++CONFIG_CRYPTO_RNG=y
++CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_RNG_DEFAULT=y
++CONFIG_CRYPTO_AKCIPHER2=y
++CONFIG_CRYPTO_AKCIPHER=y
++CONFIG_CRYPTO_KPP2=y
++CONFIG_CRYPTO_KPP=y
++CONFIG_CRYPTO_ACOMP2=y
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_MANAGER2=y
++# CONFIG_CRYPTO_USER is not set
++CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
++CONFIG_CRYPTO_GF128MUL=y
++CONFIG_CRYPTO_NULL=y
++CONFIG_CRYPTO_NULL2=y
++# CONFIG_CRYPTO_PCRYPT is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Public-key cryptography
++#
++CONFIG_CRYPTO_RSA=y
++# CONFIG_CRYPTO_DH is not set
++CONFIG_CRYPTO_ECC=y
++CONFIG_CRYPTO_ECDH=y
++# CONFIG_CRYPTO_ECDSA is not set
++# CONFIG_CRYPTO_ECRDSA is not set
++# CONFIG_CRYPTO_SM2 is not set
++# CONFIG_CRYPTO_CURVE25519 is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++CONFIG_CRYPTO_CCM=y
++CONFIG_CRYPTO_GCM=y
++# CONFIG_CRYPTO_CHACHA20POLY1305 is not set
++# CONFIG_CRYPTO_AEGIS128 is not set
++CONFIG_CRYPTO_SEQIV=m
++CONFIG_CRYPTO_ECHAINIV=m
++
++#
++# Block modes
++#
++# CONFIG_CRYPTO_CBC is not set
++# CONFIG_CRYPTO_CFB is not set
++CONFIG_CRYPTO_CTR=y
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=y
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_OFB is not set
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_KEYWRAP is not set
++# CONFIG_CRYPTO_ADIANTUM is not set
++# CONFIG_CRYPTO_ESSIV is not set
++
++#
++# Hash modes
++#
++CONFIG_CRYPTO_CMAC=y
++CONFIG_CRYPTO_HMAC=y
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_VMAC is not set
++
++#
++# Digest
++#
++CONFIG_CRYPTO_CRC32C=y
++# CONFIG_CRYPTO_CRC32 is not set
++# CONFIG_CRYPTO_XXHASH is not set
++# CONFIG_CRYPTO_BLAKE2B is not set
++# CONFIG_CRYPTO_BLAKE2S is not set
++# CONFIG_CRYPTO_CRCT10DIF is not set
++CONFIG_CRYPTO_GHASH=y
++# CONFIG_CRYPTO_POLY1305 is not set
++# CONFIG_CRYPTO_MD4 is not set
++# CONFIG_CRYPTO_MD5 is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_RMD128 is not set
++# CONFIG_CRYPTO_RMD160 is not set
++# CONFIG_CRYPTO_RMD256 is not set
++# CONFIG_CRYPTO_RMD320 is not set
++# CONFIG_CRYPTO_SHA1 is not set
++CONFIG_CRYPTO_SHA256=y
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_SHA3 is not set
++# CONFIG_CRYPTO_SM3_GENERIC is not set
++# CONFIG_CRYPTO_STREEBOG is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_WP512 is not set
++
++#
++# Ciphers
++#
++CONFIG_CRYPTO_AES=y
++# CONFIG_CRYPTO_AES_TI is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_DES is not set
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_CHACHA20 is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_SM4_GENERIC is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++
++#
++# Compression
++#
++CONFIG_CRYPTO_DEFLATE=y
++CONFIG_CRYPTO_LZO=y
++# CONFIG_CRYPTO_842 is not set
++# CONFIG_CRYPTO_LZ4 is not set
++# CONFIG_CRYPTO_LZ4HC is not set
++# CONFIG_CRYPTO_ZSTD is not set
++
++#
++# Random Number Generation
++#
++# CONFIG_CRYPTO_ANSI_CPRNG is not set
++CONFIG_CRYPTO_DRBG_MENU=y
++CONFIG_CRYPTO_DRBG_HMAC=y
++# CONFIG_CRYPTO_DRBG_HASH is not set
++# CONFIG_CRYPTO_DRBG_CTR is not set
++CONFIG_CRYPTO_DRBG=y
++CONFIG_CRYPTO_JITTERENTROPY=y
++# CONFIG_CRYPTO_USER_API_HASH is not set
++# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
++# CONFIG_CRYPTO_USER_API_RNG is not set
++# CONFIG_CRYPTO_USER_API_AEAD is not set
++CONFIG_CRYPTO_HASH_INFO=y
++CONFIG_CRYPTO_HW=y
++# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set
++# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set
++# CONFIG_CRYPTO_DEV_CCP is not set
++# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set
++# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set
++# CONFIG_CRYPTO_DEV_SAFEXCEL is not set
++# CONFIG_CRYPTO_DEV_CCREE is not set
++# CONFIG_CRYPTO_DEV_HISI_SEC is not set
++# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set
++CONFIG_ASYMMETRIC_KEY_TYPE=y
++CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
++CONFIG_X509_CERTIFICATE_PARSER=y
++# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set
++CONFIG_PKCS7_MESSAGE_PARSER=y
++# CONFIG_PKCS7_TEST_KEY is not set
++# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set
++# CONFIG_PGP_LIBRARY is not set
++# CONFIG_PGP_KEY_PARSER is not set
++# CONFIG_PGP_PRELOAD is not set
++
++#
++# Certificates for signature checking
++#
++CONFIG_SYSTEM_TRUSTED_KEYRING=y
++CONFIG_SYSTEM_TRUSTED_KEYS=""
++# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set
++# CONFIG_SECONDARY_TRUSTED_KEYRING is not set
++# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set
++# CONFIG_PGP_PRELOAD_PUBLIC_KEYS is not set
++# end of Certificates for signature checking
++
++#
++# Library routines
++#
++CONFIG_LINEAR_RANGES=y
++# CONFIG_PACKING is not set
++CONFIG_BITREVERSE=y
++CONFIG_HAVE_ARCH_BITREVERSE=y
++CONFIG_GENERIC_STRNCPY_FROM_USER=y
++CONFIG_GENERIC_STRNLEN_USER=y
++CONFIG_GENERIC_NET_UTILS=y
++# CONFIG_CORDIC is not set
++# CONFIG_PRIME_NUMBERS is not set
++CONFIG_RATIONAL=y
++CONFIG_GENERIC_PCI_IOMAP=y
++CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
++CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
++CONFIG_ARCH_USE_SYM_ANNOTATIONS=y
++# CONFIG_INDIRECT_PIO is not set
++
++#
++# Crypto library routines
++#
++CONFIG_CRYPTO_LIB_AES=y
++CONFIG_CRYPTO_LIB_ARC4=y
++CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
++# CONFIG_CRYPTO_LIB_CHACHA is not set
++# CONFIG_CRYPTO_LIB_CURVE25519 is not set
++CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9
++# CONFIG_CRYPTO_LIB_POLY1305 is not set
++# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set
++CONFIG_CRYPTO_LIB_SHA256=y
++# end of Crypto library routines
++
++CONFIG_LIB_MEMNEQ=y
++CONFIG_CRC_CCITT=y
++CONFIG_CRC16=y
++# CONFIG_CRC_T10DIF is not set
++CONFIG_CRC_ITU_T=y
++CONFIG_CRC32=y
++# CONFIG_CRC32_SELFTEST is not set
++CONFIG_CRC32_SLICEBY8=y
++# CONFIG_CRC32_SLICEBY4 is not set
++# CONFIG_CRC32_SARWATE is not set
++# CONFIG_CRC32_BIT is not set
++# CONFIG_CRC64 is not set
++# CONFIG_CRC4 is not set
++# CONFIG_CRC7 is not set
++CONFIG_LIBCRC32C=y
++# CONFIG_CRC8 is not set
++CONFIG_XXHASH=y
++CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
++# CONFIG_RANDOM32_SELFTEST is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_LZO_COMPRESS=y
++CONFIG_LZO_DECOMPRESS=y
++CONFIG_XZ_DEC=y
++CONFIG_XZ_DEC_X86=y
++CONFIG_XZ_DEC_POWERPC=y
++CONFIG_XZ_DEC_IA64=y
++CONFIG_XZ_DEC_ARM=y
++CONFIG_XZ_DEC_ARMTHUMB=y
++CONFIG_XZ_DEC_SPARC=y
++CONFIG_XZ_DEC_BCJ=y
++# CONFIG_XZ_DEC_TEST is not set
++CONFIG_GENERIC_ALLOCATOR=y
++CONFIG_INTERVAL_TREE=y
++CONFIG_ASSOCIATIVE_ARRAY=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT_MAP=y
++CONFIG_HAS_DMA=y
++CONFIG_DMA_OPS=y
++CONFIG_NEED_SG_DMA_LENGTH=y
++CONFIG_NEED_DMA_MAP_STATE=y
++CONFIG_ARCH_DMA_ADDR_T_64BIT=y
++CONFIG_DMA_DECLARE_COHERENT=y
++CONFIG_ARCH_HAS_SETUP_DMA_OPS=y
++CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y
++CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y
++CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y
++CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y
++CONFIG_SWIOTLB=y
++CONFIG_DMA_NONCOHERENT_MMAP=y
++CONFIG_DMA_COHERENT_POOL=y
++CONFIG_DMA_REMAP=y
++CONFIG_DMA_DIRECT_REMAP=y
++CONFIG_DMA_CMA=y
++# CONFIG_DMA_PERNUMA_CMA is not set
++
++#
++# Default contiguous memory area size:
++#
++CONFIG_CMA_SIZE_MBYTES=4
++CONFIG_CMA_SIZE_SEL_MBYTES=y
++# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
++# CONFIG_CMA_SIZE_SEL_MIN is not set
++# CONFIG_CMA_SIZE_SEL_MAX is not set
++CONFIG_CMA_ALIGNMENT=8
++# CONFIG_DMA_API_DEBUG is not set
++# CONFIG_DMA_MAP_BENCHMARK is not set
++CONFIG_SGL_ALLOC=y
++CONFIG_CPU_RMAP=y
++CONFIG_DQL=y
++CONFIG_GLOB=y
++# CONFIG_GLOB_SELFTEST is not set
++CONFIG_NLATTR=y
++CONFIG_CLZ_TAB=y
++# CONFIG_IRQ_POLL is not set
++CONFIG_MPILIB=y
++CONFIG_LIBFDT=y
++CONFIG_OID_REGISTRY=y
++CONFIG_HAVE_GENERIC_VDSO=y
++CONFIG_GENERIC_GETTIMEOFDAY=y
++CONFIG_GENERIC_VDSO_TIME_NS=y
++CONFIG_SG_POOL=y
++CONFIG_ARCH_STACKWALK=y
++CONFIG_SBITMAP=y
++# CONFIG_STRING_SELFTEST is not set
++# end of Library routines
++
++CONFIG_LIB_PRINT=y
++
++#
++# Kernel hacking
++#
++
++#
++# printk and dmesg options
++#
++# CONFIG_PRINTK_TIME is not set
++# CONFIG_PRINTK_CALLER is not set
++CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
++CONFIG_CONSOLE_LOGLEVEL_QUIET=4
++CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_DYNAMIC_DEBUG is not set
++# CONFIG_DYNAMIC_DEBUG_CORE is not set
++CONFIG_SYMBOLIC_ERRNAME=y
++CONFIG_DEBUG_BUGVERBOSE=y
++# end of printk and dmesg options
++
++#
++# Compile-time checks and compiler options
++#
++# CONFIG_DEBUG_INFO is not set
++CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=2048
++# CONFIG_STRIP_ASM_SYMS is not set
++# CONFIG_READABLE_ASM is not set
++# CONFIG_HEADERS_INSTALL is not set
++# CONFIG_OPTIMIZE_INLINING is not set
++# CONFIG_DEBUG_SECTION_MISMATCH is not set
++CONFIG_SECTION_MISMATCH_WARN_ONLY=y
++# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set
++CONFIG_ARCH_WANT_FRAME_POINTERS=y
++CONFIG_FRAME_POINTER=y
++# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
++# CONFIG_PGO_KERNEL is not set
++# end of Compile-time checks and compiler options
++
++#
++# Generic Kernel Debugging Instruments
++#
++CONFIG_MAGIC_SYSRQ=y
++CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
++CONFIG_MAGIC_SYSRQ_SERIAL=y
++CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE=""
++CONFIG_DEBUG_FS=y
++CONFIG_DEBUG_FS_ALLOW_ALL=y
++# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set
++# CONFIG_DEBUG_FS_ALLOW_NONE is not set
++CONFIG_HAVE_ARCH_KGDB=y
++# CONFIG_KGDB is not set
++CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
++# CONFIG_UBSAN is not set
++CONFIG_HAVE_KCSAN_COMPILER=y
++# end of Generic Kernel Debugging Instruments
++
++CONFIG_DEBUG_KERNEL=y
++CONFIG_DEBUG_MISC=y
++
++#
++# Memory Debugging
++#
++# CONFIG_PAGE_EXTENSION is not set
++# CONFIG_DEBUG_PAGEALLOC is not set
++# CONFIG_PAGE_OWNER is not set
++# CONFIG_PAGE_POISONING is not set
++# CONFIG_DEBUG_RODATA_TEST is not set
++CONFIG_ARCH_HAS_DEBUG_WX=y
++# CONFIG_DEBUG_WX is not set
++CONFIG_GENERIC_PTDUMP=y
++# CONFIG_PTDUMP_DEBUGFS is not set
++# CONFIG_DEBUG_OBJECTS is not set
++# CONFIG_SLUB_DEBUG_ON is not set
++# CONFIG_SLUB_STATS is not set
++CONFIG_HAVE_DEBUG_KMEMLEAK=y
++# CONFIG_DEBUG_KMEMLEAK is not set
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_SCHED_STACK_END_CHECK is not set
++CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_VM_PGTABLE is not set
++CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
++# CONFIG_DEBUG_VIRTUAL is not set
++# CONFIG_DEBUG_MEMORY_INIT is not set
++# CONFIG_DEBUG_PER_CPU_MAPS is not set
++CONFIG_HAVE_ARCH_KASAN=y
++CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y
++CONFIG_HAVE_ARCH_KASAN_VMALLOC=y
++CONFIG_CC_HAS_KASAN_GENERIC=y
++CONFIG_CC_HAS_KASAN_SW_TAGS=y
++CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y
++# CONFIG_KASAN is not set
++CONFIG_HAVE_ARCH_KFENCE=y
++# CONFIG_KFENCE is not set
++# end of Memory Debugging
++
++# CONFIG_DEBUG_SHIRQ is not set
++
++#
++# Debug Oops, Lockups and Hangs
++#
++CONFIG_PANIC_ON_OOPS=y
++CONFIG_PANIC_ON_OOPS_VALUE=1
++CONFIG_PANIC_TIMEOUT=1
++# CONFIG_SOFTLOCKUP_DETECTOR is not set
++
++#
++# ARM64 NMI watchdog configuration
++#
++# end of ARM64 NMI watchdog configuration
++
++CONFIG_DETECT_HUNG_TASK=y
++CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
++# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
++# CONFIG_WQ_WATCHDOG is not set
++# CONFIG_TEST_LOCKUP is not set
++# end of Debug Oops, Lockups and Hangs
++
++#
++# Scheduler Debugging
++#
++CONFIG_SCHED_DEBUG=y
++CONFIG_SCHED_INFO=y
++CONFIG_SCHEDSTATS=y
++# end of Scheduler Debugging
++
++# CONFIG_DEBUG_TIMEKEEPING is not set
++
++#
++# Lock Debugging (spinlocks, mutexes, etc...)
++#
++CONFIG_LOCK_DEBUGGING_SUPPORT=y
++# CONFIG_PROVE_LOCKING is not set
++# CONFIG_LOCK_STAT is not set
++# CONFIG_DEBUG_RT_MUTEXES is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++# CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
++# CONFIG_DEBUG_RWSEMS is not set
++# CONFIG_DEBUG_LOCK_ALLOC is not set
++# CONFIG_DEBUG_ATOMIC_SLEEP is not set
++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++# CONFIG_LOCK_TORTURE_TEST is not set
++# CONFIG_WW_MUTEX_SELFTEST is not set
++# CONFIG_SCF_TORTURE_TEST is not set
++# CONFIG_CSD_LOCK_WAIT_DEBUG is not set
++# end of Lock Debugging (spinlocks, mutexes, etc...)
++
++CONFIG_STACKTRACE=y
++# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set
++# CONFIG_DEBUG_KOBJECT is not set
++CONFIG_HAVE_DEBUG_BUGVERBOSE=y
++
++#
++# Debug kernel data structures
++#
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_PLIST is not set
++# CONFIG_DEBUG_SG is not set
++# CONFIG_DEBUG_NOTIFIERS is not set
++# CONFIG_BUG_ON_DATA_CORRUPTION is not set
++# end of Debug kernel data structures
++
++# CONFIG_DEBUG_CREDENTIALS is not set
++
++#
++# RCU Debugging
++#
++# CONFIG_RCU_SCALE_TEST is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_RCU_REF_SCALE_TEST is not set
++CONFIG_RCU_CPU_STALL_TIMEOUT=60
++CONFIG_RCU_TRACE=y
++# CONFIG_RCU_EQS_DEBUG is not set
++# end of RCU Debugging
++
++# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
++# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
++# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
++# CONFIG_LATENCYTOP is not set
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
++CONFIG_HAVE_C_RECORDMCOUNT=y
++CONFIG_TRACE_CLOCK=y
++CONFIG_TRACING_SUPPORT=y
++# CONFIG_FTRACE is not set
++# CONFIG_SAMPLES is not set
++CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
++# CONFIG_STRICT_DEVMEM is not set
++
++#
++# arm64 Debugging
++#
++# CONFIG_PID_IN_CONTEXTIDR is not set
++# CONFIG_ARM64_RELOC_TEST is not set
++# CONFIG_CORESIGHT is not set
++# end of arm64 Debugging
++
++#
++# Kernel Testing and Coverage
++#
++# CONFIG_KUNIT is not set
++# CONFIG_NOTIFIER_ERROR_INJECTION is not set
++# CONFIG_FAULT_INJECTION is not set
++CONFIG_ARCH_HAS_KCOV=y
++CONFIG_CC_HAS_SANCOV_TRACE_PC=y
++# CONFIG_KCOV is not set
++CONFIG_RUNTIME_TESTING_MENU=y
++# CONFIG_LKDTM is not set
++# CONFIG_TEST_LIST_SORT is not set
++# CONFIG_TEST_MIN_HEAP is not set
++# CONFIG_TEST_SORT is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
++# CONFIG_RBTREE_TEST is not set
++# CONFIG_REED_SOLOMON_TEST is not set
++# CONFIG_INTERVAL_TREE_TEST is not set
++# CONFIG_PERCPU_TEST is not set
++# CONFIG_ATOMIC64_SELFTEST is not set
++# CONFIG_TEST_HEXDUMP is not set
++# CONFIG_TEST_STRING_HELPERS is not set
++# CONFIG_TEST_STRSCPY is not set
++# CONFIG_TEST_KSTRTOX is not set
++# CONFIG_TEST_PRINTF is not set
++# CONFIG_TEST_BITMAP is not set
++# CONFIG_TEST_UUID is not set
++# CONFIG_TEST_XARRAY is not set
++# CONFIG_TEST_OVERFLOW is not set
++# CONFIG_TEST_RHASHTABLE is not set
++# CONFIG_TEST_HASH is not set
++# CONFIG_TEST_IDA is not set
++# CONFIG_TEST_LKM is not set
++# CONFIG_TEST_BITOPS is not set
++# CONFIG_TEST_VMALLOC is not set
++# CONFIG_TEST_USER_COPY is not set
++# CONFIG_TEST_BPF is not set
++# CONFIG_TEST_BLACKHOLE_DEV is not set
++# CONFIG_FIND_BIT_BENCHMARK is not set
++# CONFIG_TEST_FIRMWARE is not set
++# CONFIG_TEST_SYSCTL is not set
++# CONFIG_TEST_UDELAY is not set
++# CONFIG_TEST_STATIC_KEYS is not set
++# CONFIG_TEST_KMOD is not set
++# CONFIG_TEST_MEMCAT_P is not set
++# CONFIG_TEST_STACKINIT is not set
++# CONFIG_TEST_MEMINIT is not set
++# CONFIG_TEST_FREE_PAGES is not set
++# CONFIG_MEMTEST is not set
++# end of Kernel Testing and Coverage
++# end of Kernel hacking
+diff --git a/arch/arm64/configs/ss928v100_defconfig b/arch/arm64/configs/ss928v100_defconfig
+new file mode 100644
+index 000000000000..b1208fd69331
+--- /dev/null
++++ b/arch/arm64/configs/ss928v100_defconfig
+@@ -0,0 +1,3665 @@
++#
++# Automatically generated file; DO NOT EDIT.
++# Linux/arm64 4.19.90 Kernel Configuration
++#
++
++#
++# Compiler: aarch64-mix210-linux-gcc (HC&C V1R3C00SPC200B042_20221123) 7.3.0
++#
++CONFIG_CC_IS_GCC=y
++CONFIG_GCC_VERSION=70300
++CONFIG_CLANG_VERSION=0
++CONFIG_CC_HAS_ASM_GOTO=y
++CONFIG_IRQ_WORK=y
++CONFIG_BUILDTIME_EXTABLE_SORT=y
++CONFIG_THREAD_INFO_IN_TASK=y
++
++#
++# General setup
++#
++CONFIG_INIT_ENV_ARG_LIMIT=32
++# CONFIG_COMPILE_TEST is not set
++CONFIG_LOCALVERSION=""
++# CONFIG_LOCALVERSION_AUTO is not set
++CONFIG_BUILD_SALT=""
++CONFIG_DEFAULT_HOSTNAME="(none)"
++# CONFIG_SWAP is not set
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++CONFIG_CROSS_MEMORY_ATTACH=y
++CONFIG_USELIB=y
++# CONFIG_AUDIT is not set
++CONFIG_HAVE_ARCH_AUDITSYSCALL=y
++
++#
++# IRQ subsystem
++#
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
++CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
++CONFIG_GENERIC_IRQ_MIGRATION=y
++CONFIG_HARDIRQS_SW_RESEND=y
++CONFIG_IRQ_DOMAIN=y
++CONFIG_IRQ_DOMAIN_HIERARCHY=y
++CONFIG_GENERIC_MSI_IRQ=y
++CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
++CONFIG_HANDLE_DOMAIN_IRQ=y
++CONFIG_IRQ_FORCED_THREADING=y
++CONFIG_SPARSE_IRQ=y
++CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
++CONFIG_ARCH_CLOCKSOURCE_DATA=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_ARCH_HAS_TICK_BROADCAST=y
++CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
++
++#
++# Timers subsystem
++#
++CONFIG_HZ_PERIODIC=y
++# CONFIG_NO_HZ_IDLE is not set
++# CONFIG_NO_HZ_FULL is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_PREEMPT_NONE=y
++# CONFIG_PREEMPT_VOLUNTARY is not set
++# CONFIG_PREEMPT is not set
++
++#
++# CPU/Task time and stats accounting
++#
++CONFIG_TICK_CPU_ACCOUNTING=y
++# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
++# CONFIG_IRQ_TIME_ACCOUNTING is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++CONFIG_CPU_ISOLATION=y
++
++#
++# RCU Subsystem
++#
++CONFIG_TREE_RCU=y
++# CONFIG_RCU_EXPERT is not set
++CONFIG_SRCU=y
++CONFIG_TREE_SRCU=y
++CONFIG_RCU_STALL_COMMON=y
++CONFIG_RCU_NEED_SEGCBLIST=y
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
++CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
++CONFIG_GENERIC_SCHED_CLOCK=y
++CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
++CONFIG_ARCH_SUPPORTS_INT128=y
++# CONFIG_CGROUPS is not set
++CONFIG_NAMESPACES=y
++CONFIG_UTS_NS=y
++CONFIG_IPC_NS=y
++# CONFIG_USER_NS is not set
++CONFIG_PID_NS=y
++CONFIG_NET_NS=y
++# CONFIG_CHECKPOINT_RESTORE is not set
++# CONFIG_SCHED_AUTOGROUP is not set
++# CONFIG_SYSFS_DEPRECATED is not set
++CONFIG_RELAY=y
++# CONFIG_BLK_DEV_INITRD is not set
++CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_ANON_INODES=y
++CONFIG_HAVE_UID16=y
++CONFIG_SYSCTL_EXCEPTION_TRACE=y
++CONFIG_BPF=y
++CONFIG_EXPERT=y
++CONFIG_UID16=y
++CONFIG_MULTIUSER=y
++# CONFIG_SGETMASK_SYSCALL is not set
++CONFIG_SYSFS_SYSCALL=y
++# CONFIG_SYSCTL_SYSCALL is not set
++# CONFIG_FHANDLE is not set
++CONFIG_POSIX_TIMERS=y
++CONFIG_PRINTK=y
++CONFIG_PRINTK_NMI=y
++CONFIG_BUG=y
++CONFIG_ELF_CORE=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_FUTEX_PI=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_AIO=y
++CONFIG_ADVISE_SYSCALLS=y
++CONFIG_MEMBARRIER=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++CONFIG_KALLSYMS_BASE_RELATIVE=y
++CONFIG_BPF_SYSCALL=y
++CONFIG_USERFAULTFD=y
++CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
++CONFIG_RSEQ=y
++# CONFIG_DEBUG_RSEQ is not set
++CONFIG_EMBEDDED=y
++CONFIG_HAVE_PERF_EVENTS=y
++# CONFIG_PC104 is not set
++
++#
++# Kernel Performance Events And Counters
++#
++# CONFIG_PERF_EVENTS is not set
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++# CONFIG_COMPAT_BRK is not set
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++CONFIG_SLAB_MERGE_DEFAULT=y
++# CONFIG_SLAB_FREELIST_RANDOM is not set
++# CONFIG_SLAB_FREELIST_HARDENED is not set
++CONFIG_SLUB_CPU_PARTIAL=y
++# CONFIG_PROFILING is not set
++CONFIG_ARM64=y
++CONFIG_64BIT=y
++CONFIG_MMU=y
++CONFIG_ARM64_PAGE_SHIFT=12
++CONFIG_ARM64_CONT_SHIFT=4
++CONFIG_ARCH_MMAP_RND_BITS_MIN=18
++CONFIG_ARCH_MMAP_RND_BITS_MAX=24
++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
++CONFIG_LOCKDEP_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_RWSEM_XCHGADD_ALGORITHM=y
++CONFIG_GENERIC_BUG=y
++CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CSUM=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_ZONE_DMA32=y
++CONFIG_HAVE_GENERIC_GUP=y
++CONFIG_SMP=y
++CONFIG_KERNEL_MODE_NEON=y
++CONFIG_FIX_EARLYCON_MEM=y
++CONFIG_PGTABLE_LEVELS=3
++CONFIG_ARCH_SUPPORTS_UPROBES=y
++CONFIG_ARCH_PROC_KCORE_TEXT=y
++
++#
++# Platform selection
++#
++# CONFIG_ARCH_ACTIONS is not set
++# CONFIG_ARCH_SUNXI is not set
++# CONFIG_ARCH_ALPINE is not set
++# CONFIG_ARCH_BCM2835 is not set
++# CONFIG_ARCH_BCM_IPROC is not set
++# CONFIG_ARCH_BERLIN is not set
++# CONFIG_ARCH_BRCMSTB is not set
++# CONFIG_ARCH_EXYNOS is not set
++# CONFIG_ARCH_K3 is not set
++# CONFIG_ARCH_LAYERSCAPE is not set
++# CONFIG_ARCH_LG1K is not set
++# CONFIG_ARCH_HISI is not set
++CONFIG_ARCH_BSP=y
++# CONFIG_ARCH_SS528V100 is not set
++# CONFIG_ARCH_SS625V100 is not set
++# CONFIG_ARCH_SS919V100 is not set
++# CONFIG_ARCH_SS015V100 is not set
++CONFIG_ARCH_SS928V100=y
++# CONFIG_ARCH_SS927V100 is not set
++# CONFIG_ARCH_MEDIATEK is not set
++# CONFIG_ARCH_MESON is not set
++# CONFIG_ARCH_MVEBU is not set
++# CONFIG_ARCH_QCOM is not set
++# CONFIG_ARCH_REALTEK is not set
++# CONFIG_ARCH_ROCKCHIP is not set
++# CONFIG_ARCH_SEATTLE is not set
++# CONFIG_ARCH_SYNQUACER is not set
++# CONFIG_ARCH_RENESAS is not set
++# CONFIG_ARCH_STRATIX10 is not set
++# CONFIG_ARCH_TEGRA is not set
++# CONFIG_ARCH_SPRD is not set
++# CONFIG_ARCH_THUNDER is not set
++# CONFIG_ARCH_THUNDER2 is not set
++# CONFIG_ARCH_UNIPHIER is not set
++# CONFIG_ARCH_VEXPRESS is not set
++# CONFIG_ARCH_XGENE is not set
++# CONFIG_ARCH_ZX is not set
++# CONFIG_ARCH_ZYNQMP is not set
++
++#
++# Bus support
++#
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_DOMAINS_GENERIC=y
++CONFIG_PCI_SYSCALL=y
++CONFIG_PCIEPORTBUS=y
++# CONFIG_PCIEAER is not set
++# CONFIG_PCIEASPM is not set
++CONFIG_PCIE_PME=y
++# CONFIG_PCIE_PTM is not set
++CONFIG_PCI_MSI=y
++CONFIG_PCI_MSI_IRQ_DOMAIN=y
++CONFIG_PCI_QUIRKS=y
++# CONFIG_PCI_DEBUG is not set
++# CONFIG_PCI_STUB is not set
++# CONFIG_PCI_IOV is not set
++# CONFIG_PCI_PRI is not set
++# CONFIG_PCI_PASID is not set
++# CONFIG_HOTPLUG_PCI is not set
++
++#
++# PCI controller drivers
++#
++
++#
++# Cadence PCIe controllers support
++#
++# CONFIG_PCIE_CADENCE_HOST is not set
++# CONFIG_PCI_FTPCI100 is not set
++# CONFIG_PCI_HOST_GENERIC is not set
++# CONFIG_PCIE_XILINX is not set
++# CONFIG_PCI_XGENE is not set
++# CONFIG_PCI_HOST_THUNDER_PEM is not set
++# CONFIG_PCI_HOST_THUNDER_ECAM is not set
++
++#
++# DesignWare PCI Core Support
++#
++# CONFIG_PCIE_DW_PLAT_HOST is not set
++# CONFIG_PCI_HISI is not set
++# CONFIG_PCIE_KIRIN is not set
++
++#
++# PCI Endpoint
++#
++# CONFIG_PCI_ENDPOINT is not set
++
++#
++# PCI switch controller drivers
++#
++# CONFIG_PCI_SW_SWITCHTEC is not set
++# CONFIG_BSP_PCIE is not set
++
++#
++# Kernel Features
++#
++
++#
++# ARM errata workarounds via the alternatives framework
++#
++CONFIG_ARM64_ERRATUM_826319=y
++CONFIG_ARM64_ERRATUM_827319=y
++CONFIG_ARM64_ERRATUM_824069=y
++CONFIG_ARM64_ERRATUM_819472=y
++CONFIG_ARM64_ERRATUM_832075=y
++CONFIG_ARM64_ERRATUM_845719=y
++CONFIG_ARM64_ERRATUM_843419=y
++CONFIG_ARM64_ERRATUM_1024718=y
++CONFIG_ARM64_ERRATUM_1463225=y
++CONFIG_CAVIUM_ERRATUM_22375=y
++CONFIG_CAVIUM_ERRATUM_23154=y
++CONFIG_CAVIUM_ERRATUM_27456=y
++CONFIG_CAVIUM_ERRATUM_30115=y
++CONFIG_QCOM_FALKOR_ERRATUM_1003=y
++CONFIG_QCOM_FALKOR_ERRATUM_1009=y
++CONFIG_QCOM_QDF2400_ERRATUM_0065=y
++CONFIG_SOCIONEXT_SYNQUACER_PREITS=y
++CONFIG_HISILICON_ERRATUM_161600802=y
++CONFIG_QCOM_FALKOR_ERRATUM_E1041=y
++CONFIG_ARM64_4K_PAGES=y
++# CONFIG_ARM64_16K_PAGES is not set
++# CONFIG_ARM64_64K_PAGES is not set
++CONFIG_ARM64_VA_BITS_39=y
++# CONFIG_ARM64_VA_BITS_48 is not set
++CONFIG_ARM64_VA_BITS=39
++CONFIG_ARM64_PA_BITS_48=y
++CONFIG_ARM64_PA_BITS=48
++# CONFIG_CPU_BIG_ENDIAN is not set
++CONFIG_SCHED_MC=y
++# CONFIG_SCHED_SMT is not set
++CONFIG_NR_CPUS=4
++CONFIG_HOTPLUG_CPU=y
++# CONFIG_NUMA is not set
++CONFIG_HOLES_IN_ZONE=y
++CONFIG_HZ_100=y
++# CONFIG_HZ_250 is not set
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=100
++CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
++CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y
++CONFIG_ARCH_SPARSEMEM_ENABLE=y
++CONFIG_ARCH_SPARSEMEM_DEFAULT=y
++CONFIG_ARCH_SELECT_MEMORY_MODEL=y
++CONFIG_ARCH_FLATMEM_ENABLE=y
++CONFIG_HAVE_ARCH_PFN_VALID=y
++CONFIG_SYS_SUPPORTS_HUGETLBFS=y
++CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
++CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
++# CONFIG_SECCOMP is not set
++# CONFIG_PARAVIRT is not set
++# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
++# CONFIG_KEXEC is not set
++# CONFIG_CRASH_DUMP is not set
++# CONFIG_XEN is not set
++CONFIG_FORCE_MAX_ZONEORDER=11
++CONFIG_UNMAP_KERNEL_AT_EL0=y
++CONFIG_HARDEN_BRANCH_PREDICTOR=y
++CONFIG_HARDEN_EL2_VECTORS=y
++CONFIG_ARM64_SSBD=y
++# CONFIG_ARMV8_DEPRECATED is not set
++# CONFIG_ARM64_SW_TTBR0_PAN is not set
++
++#
++# ARMv8.1 architectural features
++#
++CONFIG_ARM64_HW_AFDBM=y
++CONFIG_ARM64_PAN=y
++# CONFIG_ARM64_LSE_ATOMICS is not set
++CONFIG_ARM64_VHE=y
++
++#
++# ARMv8.2 architectural features
++#
++CONFIG_ARM64_UAO=y
++# CONFIG_ARM64_PMEM is not set
++CONFIG_ARM64_RAS_EXTN=y
++CONFIG_ARM64_SVE=y
++CONFIG_ARM64_MODULE_PLTS=y
++# CONFIG_RANDOMIZE_BASE is not set
++
++#
++# Boot options
++#
++CONFIG_CMDLINE="mem=128M console=ttyAMA0,115200 console=ttyMTD,blackbox"
++# CONFIG_CMDLINE_FORCE is not set
++# CONFIG_EFI is not set
++CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y
++CONFIG_IMG_GZ_DTB=y
++# CONFIG_IMG_DTB is not set
++CONFIG_BUILD_ARM64_APPENDED_KERNEL_IMAGE_NAME="Image.gz-dtb"
++CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES="vendor/ss928v100-demb-flash"
++CONFIG_COMPAT=y
++CONFIG_SYSVIPC_COMPAT=y
++
++#
++# Power management options
++#
++CONFIG_SUSPEND=y
++CONFIG_SUSPEND_FREEZER=y
++# CONFIG_SUSPEND_SKIP_SYNC is not set
++CONFIG_PM_SLEEP=y
++CONFIG_PM_SLEEP_SMP=y
++# CONFIG_PM_AUTOSLEEP is not set
++# CONFIG_PM_WAKELOCKS is not set
++CONFIG_PM=y
++# CONFIG_PM_DEBUG is not set
++CONFIG_PM_CLK=y
++# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
++CONFIG_CPU_PM=y
++CONFIG_ARCH_HIBERNATION_POSSIBLE=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++
++#
++# CPU Power Management
++#
++
++#
++# CPU Idle
++#
++# CONFIG_CPU_IDLE is not set
++
++#
++# CPU Frequency scaling
++#
++CONFIG_CPU_FREQ=y
++CONFIG_CPU_FREQ_GOV_ATTR_SET=y
++CONFIG_CPU_FREQ_GOV_COMMON=y
++CONFIG_CPU_FREQ_STAT=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
++CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
++CONFIG_CPU_FREQ_GOV_POWERSAVE=y
++CONFIG_CPU_FREQ_GOV_USERSPACE=y
++CONFIG_CPU_FREQ_GOV_ONDEMAND=y
++CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
++# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set
++
++#
++# CPU frequency scaling drivers
++#
++CONFIG_CPUFREQ_DT=y
++CONFIG_CPUFREQ_DT_PLATDEV=y
++# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set
++# CONFIG_QORIQ_CPUFREQ is not set
++
++#
++# Firmware Drivers
++#
++CONFIG_ARM_PSCI_FW=y
++# CONFIG_ARM_SDE_INTERFACE is not set
++# CONFIG_FIRMWARE_MEMMAP is not set
++# CONFIG_FW_CFG_SYSFS is not set
++CONFIG_HAVE_ARM_SMCCC=y
++# CONFIG_GOOGLE_FIRMWARE is not set
++
++#
++# Tegra firmware driver
++#
++# CONFIG_VIRTUALIZATION is not set
++# CONFIG_ARM64_CRYPTO is not set
++
++#
++# General architecture-dependent options
++#
++# CONFIG_KPROBES is not set
++# CONFIG_JUMP_LABEL is not set
++CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_HAVE_NMI=y
++CONFIG_HAVE_ARCH_TRACEHOOK=y
++CONFIG_HAVE_DMA_CONTIGUOUS=y
++CONFIG_GENERIC_SMP_IDLE_THREAD=y
++CONFIG_GENERIC_IDLE_POLL_SETUP=y
++CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
++CONFIG_ARCH_HAS_SET_MEMORY=y
++CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
++CONFIG_HAVE_RSEQ=y
++CONFIG_HAVE_CLK=y
++CONFIG_HAVE_PERF_REGS=y
++CONFIG_HAVE_PERF_USER_STACK_DUMP=y
++CONFIG_HAVE_ARCH_JUMP_LABEL=y
++CONFIG_HAVE_RCU_TABLE_FREE=y
++CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
++CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
++CONFIG_HAVE_CMPXCHG_LOCAL=y
++CONFIG_HAVE_CMPXCHG_DOUBLE=y
++CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
++CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
++CONFIG_HAVE_STACKPROTECTOR=y
++CONFIG_CC_HAS_STACKPROTECTOR_NONE=y
++CONFIG_STACKPROTECTOR=y
++CONFIG_STACKPROTECTOR_STRONG=y
++CONFIG_HAVE_CONTEXT_TRACKING=y
++CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
++CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
++CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
++CONFIG_HAVE_ARCH_HUGE_VMAP=y
++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
++CONFIG_MODULES_USE_ELF_RELA=y
++CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
++CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
++CONFIG_ARCH_MMAP_RND_BITS=18
++CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y
++CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11
++CONFIG_CLONE_BACKWARDS=y
++CONFIG_OLD_SIGSUSPEND3=y
++CONFIG_COMPAT_OLD_SIGACTION=y
++CONFIG_COMPAT_32BIT_TIME=y
++CONFIG_HAVE_ARCH_VMAP_STACK=y
++CONFIG_VMAP_STACK=y
++CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
++CONFIG_STRICT_KERNEL_RWX=y
++CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
++CONFIG_STRICT_MODULE_RWX=y
++CONFIG_REFCOUNT_FULL=y
++CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y
++
++#
++# GCOV-based kernel profiling
++#
++CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
++CONFIG_PLUGIN_HOSTCC=""
++CONFIG_HAVE_GCC_PLUGINS=y
++CONFIG_RT_MUTEXES=y
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_FORCE_LOAD=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++# CONFIG_MODULE_SIG is not set
++# CONFIG_MODULE_COMPRESS is not set
++# CONFIG_TRIM_UNUSED_KSYMS is not set
++CONFIG_BLOCK=y
++CONFIG_BLK_SCSI_REQUEST=y
++CONFIG_BLK_DEV_BSG=y
++# CONFIG_BLK_DEV_BSGLIB is not set
++# CONFIG_BLK_DEV_INTEGRITY is not set
++# CONFIG_BLK_DEV_ZONED is not set
++CONFIG_BLK_CMDLINE_PARSER=y
++# CONFIG_BLK_WBT is not set
++# CONFIG_BLK_SED_OPAL is not set
++
++#
++# Partition Types
++#
++CONFIG_PARTITION_ADVANCED=y
++# CONFIG_ACORN_PARTITION is not set
++# CONFIG_AIX_PARTITION is not set
++# CONFIG_OSF_PARTITION is not set
++# CONFIG_AMIGA_PARTITION is not set
++# CONFIG_ATARI_PARTITION is not set
++# CONFIG_MAC_PARTITION is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_BSD_DISKLABEL is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# CONFIG_UNIXWARE_DISKLABEL is not set
++# CONFIG_LDM_PARTITION is not set
++# CONFIG_SGI_PARTITION is not set
++# CONFIG_ULTRIX_PARTITION is not set
++# CONFIG_SUN_PARTITION is not set
++# CONFIG_KARMA_PARTITION is not set
++CONFIG_EFI_PARTITION=y
++# CONFIG_SYSV68_PARTITION is not set
++CONFIG_CMDLINE_PARTITION=y
++CONFIG_BLOCK_COMPAT=y
++CONFIG_BLK_MQ_PCI=y
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_DEADLINE=y
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="deadline"
++CONFIG_MQ_IOSCHED_DEADLINE=y
++CONFIG_MQ_IOSCHED_KYBER=y
++# CONFIG_IOSCHED_BFQ is not set
++CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y
++CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_LOCK=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_INLINE_READ_LOCK=y
++CONFIG_ARCH_INLINE_READ_LOCK_BH=y
++CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_READ_UNLOCK=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_INLINE_WRITE_LOCK=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_SPIN_TRYLOCK=y
++CONFIG_INLINE_SPIN_TRYLOCK_BH=y
++CONFIG_INLINE_SPIN_LOCK=y
++CONFIG_INLINE_SPIN_LOCK_BH=y
++CONFIG_INLINE_SPIN_LOCK_IRQ=y
++CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y
++CONFIG_INLINE_SPIN_UNLOCK_BH=y
++CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
++CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_READ_LOCK=y
++CONFIG_INLINE_READ_LOCK_BH=y
++CONFIG_INLINE_READ_LOCK_IRQ=y
++CONFIG_INLINE_READ_LOCK_IRQSAVE=y
++CONFIG_INLINE_READ_UNLOCK=y
++CONFIG_INLINE_READ_UNLOCK_BH=y
++CONFIG_INLINE_READ_UNLOCK_IRQ=y
++CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_WRITE_LOCK=y
++CONFIG_INLINE_WRITE_LOCK_BH=y
++CONFIG_INLINE_WRITE_LOCK_IRQ=y
++CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y
++CONFIG_INLINE_WRITE_UNLOCK=y
++CONFIG_INLINE_WRITE_UNLOCK_BH=y
++CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
++CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
++CONFIG_MUTEX_SPIN_ON_OWNER=y
++CONFIG_RWSEM_SPIN_ON_OWNER=y
++CONFIG_LOCK_SPIN_ON_OWNER=y
++CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
++CONFIG_QUEUED_SPINLOCKS=y
++CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
++CONFIG_QUEUED_RWLOCKS=y
++CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y
++CONFIG_FREEZER=y
++
++#
++# Executable file formats
++#
++CONFIG_BINFMT_ELF=y
++CONFIG_COMPAT_BINFMT_ELF=y
++CONFIG_ELFCORE=y
++CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
++CONFIG_BINFMT_SCRIPT=y
++# CONFIG_BINFMT_MISC is not set
++CONFIG_COREDUMP=y
++
++#
++# Memory Management options
++#
++CONFIG_SELECT_MEMORY_MODEL=y
++# CONFIG_FLATMEM_MANUAL is not set
++CONFIG_SPARSEMEM_MANUAL=y
++CONFIG_SPARSEMEM=y
++CONFIG_HAVE_MEMORY_PRESENT=y
++CONFIG_SPARSEMEM_EXTREME=y
++CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
++CONFIG_SPARSEMEM_VMEMMAP=y
++CONFIG_HAVE_MEMBLOCK=y
++CONFIG_NO_BOOTMEM=y
++CONFIG_MEMORY_ISOLATION=y
++CONFIG_SPLIT_PTLOCK_CPUS=4
++CONFIG_COMPACTION=y
++CONFIG_MIGRATION=y
++CONFIG_PHYS_ADDR_T_64BIT=y
++CONFIG_MMU_NOTIFIER=y
++CONFIG_KSM=y
++CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
++CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
++# CONFIG_MEMORY_FAILURE is not set
++# CONFIG_TRANSPARENT_HUGEPAGE is not set
++# CONFIG_CLEANCACHE is not set
++CONFIG_CMA=y
++# CONFIG_CMA_DEBUG is not set
++CONFIG_CMA_AREAS=7
++# CONFIG_ZPOOL is not set
++# CONFIG_ZBUD is not set
++# CONFIG_ZSMALLOC is not set
++CONFIG_GENERIC_EARLY_IOREMAP=y
++# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
++# CONFIG_IDLE_PAGE_TRACKING is not set
++CONFIG_FRAME_VECTOR=y
++# CONFIG_PERCPU_STATS is not set
++# CONFIG_GUP_BENCHMARK is not set
++CONFIG_ARCH_HAS_PTE_SPECIAL=y
++CONFIG_NET=y
++CONFIG_NET_INGRESS=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_DIAG is not set
++CONFIG_UNIX=y
++# CONFIG_UNIX_DIAG is not set
++# CONFIG_TLS is not set
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# CONFIG_XFRM_INTERFACE is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
++# CONFIG_NET_KEY is not set
++# CONFIG_XDP_SOCKETS is not set
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=y
++# CONFIG_IP_ADVANCED_ROUTER is not set
++# CONFIG_IP_PNP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE_DEMUX is not set
++CONFIG_NET_IP_TUNNEL=m
++# CONFIG_IP_MROUTE is not set
++# CONFIG_SYN_COOKIES is not set
++# CONFIG_NET_IPVTI is not set
++# CONFIG_NET_FOU is not set
++# CONFIG_NET_FOU_IP_TUNNELS is not set
++# CONFIG_INET_AH is not set
++# CONFIG_INET_ESP is not set
++# CONFIG_INET_IPCOMP is not set
++CONFIG_INET_TUNNEL=m
++CONFIG_INET_XFRM_MODE_TRANSPORT=y
++CONFIG_INET_XFRM_MODE_TUNNEL=y
++CONFIG_INET_XFRM_MODE_BEET=y
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_INET_UDP_DIAG is not set
++# CONFIG_INET_RAW_DIAG is not set
++# CONFIG_INET_DIAG_DESTROY is not set
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++CONFIG_IPV6=y
++CONFIG_IPV6_ROUTER_PREF=y
++# CONFIG_IPV6_ROUTE_INFO is not set
++# CONFIG_IPV6_OPTIMISTIC_DAD is not set
++# CONFIG_INET6_AH is not set
++# CONFIG_INET6_ESP is not set
++# CONFIG_INET6_IPCOMP is not set
++# CONFIG_IPV6_MIP6 is not set
++# CONFIG_IPV6_ILA is not set
++CONFIG_INET6_XFRM_MODE_TRANSPORT=m
++CONFIG_INET6_XFRM_MODE_TUNNEL=m
++CONFIG_INET6_XFRM_MODE_BEET=m
++# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
++# CONFIG_IPV6_VTI is not set
++CONFIG_IPV6_SIT=m
++# CONFIG_IPV6_SIT_6RD is not set
++CONFIG_IPV6_NDISC_NODETYPE=y
++# CONFIG_IPV6_TUNNEL is not set
++# CONFIG_IPV6_MULTIPLE_TABLES is not set
++# CONFIG_IPV6_MROUTE is not set
++# CONFIG_IPV6_SEG6_LWTUNNEL is not set
++# CONFIG_IPV6_SEG6_HMAC is not set
++# CONFIG_NETWORK_SECMARK is not set
++# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
++CONFIG_NETFILTER=y
++CONFIG_NETFILTER_ADVANCED=y
++
++#
++# Core Netfilter Configuration
++#
++CONFIG_NETFILTER_INGRESS=y
++# CONFIG_NETFILTER_NETLINK_ACCT is not set
++# CONFIG_NETFILTER_NETLINK_QUEUE is not set
++# CONFIG_NETFILTER_NETLINK_LOG is not set
++# CONFIG_NETFILTER_NETLINK_OSF is not set
++# CONFIG_NF_CONNTRACK is not set
++# CONFIG_NF_LOG_NETDEV is not set
++# CONFIG_NF_TABLES is not set
++# CONFIG_NETFILTER_XTABLES is not set
++# CONFIG_IP_SET is not set
++# CONFIG_IP_VS is not set
++
++#
++# IP: Netfilter Configuration
++#
++# CONFIG_NF_SOCKET_IPV4 is not set
++# CONFIG_NF_TPROXY_IPV4 is not set
++# CONFIG_NF_DUP_IPV4 is not set
++# CONFIG_NF_LOG_ARP is not set
++# CONFIG_NF_LOG_IPV4 is not set
++# CONFIG_NF_REJECT_IPV4 is not set
++# CONFIG_IP_NF_IPTABLES is not set
++# CONFIG_IP_NF_ARPTABLES is not set
++
++#
++# IPv6: Netfilter Configuration
++#
++# CONFIG_NF_SOCKET_IPV6 is not set
++# CONFIG_NF_TPROXY_IPV6 is not set
++# CONFIG_NF_DUP_IPV6 is not set
++# CONFIG_NF_REJECT_IPV6 is not set
++# CONFIG_NF_LOG_IPV6 is not set
++# CONFIG_IP6_NF_IPTABLES is not set
++# CONFIG_BPFILTER is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_RDS is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_L2TP is not set
++# CONFIG_BRIDGE is not set
++CONFIG_HAVE_NET_DSA=y
++# CONFIG_NET_DSA is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_PHONET is not set
++# CONFIG_6LOWPAN is not set
++# CONFIG_IEEE802154 is not set
++# CONFIG_NET_SCHED is not set
++# CONFIG_DCB is not set
++# CONFIG_BATMAN_ADV is not set
++# CONFIG_OPENVSWITCH is not set
++# CONFIG_VSOCKETS is not set
++# CONFIG_NETLINK_DIAG is not set
++# CONFIG_MPLS is not set
++# CONFIG_NET_NSH is not set
++# CONFIG_HSR is not set
++# CONFIG_NET_SWITCHDEV is not set
++# CONFIG_NET_L3_MASTER_DEV is not set
++# CONFIG_NET_NCSI is not set
++CONFIG_RPS=y
++CONFIG_RFS_ACCEL=y
++CONFIG_XPS=y
++CONFIG_NET_RX_BUSY_POLL=y
++CONFIG_BQL=y
++# CONFIG_BPF_JIT is not set
++# CONFIG_BPF_STREAM_PARSER is not set
++CONFIG_NET_FLOW_LIMIT=y
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
++# CONFIG_BT is not set
++# CONFIG_AF_RXRPC is not set
++# CONFIG_AF_KCM is not set
++CONFIG_WIRELESS=y
++# CONFIG_CFG80211 is not set
++
++#
++# CFG80211 needs to be enabled for MAC80211
++#
++CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
++# CONFIG_WIMAX is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++# CONFIG_CAIF is not set
++# CONFIG_CEPH_LIB is not set
++# CONFIG_NFC is not set
++# CONFIG_PSAMPLE is not set
++# CONFIG_NET_IFE is not set
++# CONFIG_LWTUNNEL is not set
++CONFIG_DST_CACHE=y
++CONFIG_GRO_CELLS=y
++# CONFIG_NET_DEVLINK is not set
++CONFIG_MAY_USE_DEVLINK=y
++# CONFIG_FAILOVER is not set
++CONFIG_HAVE_EBPF_JIT=y
++
++#
++# Device Drivers
++#
++CONFIG_ARM_AMBA=y
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER=y
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_DEVTMPFS=y
++CONFIG_DEVTMPFS_MOUNT=y
++CONFIG_STANDALONE=y
++# CONFIG_PREVENT_FIRMWARE_BUILD is not set
++
++#
++# Firmware loader
++#
++CONFIG_FW_LOADER=y
++CONFIG_EXTRA_FIRMWARE=""
++# CONFIG_FW_LOADER_USER_HELPER is not set
++CONFIG_ALLOW_DEV_COREDUMP=y
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
++# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
++CONFIG_GENERIC_CPU_AUTOPROBE=y
++CONFIG_GENERIC_CPU_VULNERABILITIES=y
++CONFIG_REGMAP=y
++CONFIG_REGMAP_I2C=y
++CONFIG_REGMAP_SPI=y
++CONFIG_REGMAP_MMIO=y
++CONFIG_DMA_SHARED_BUFFER=y
++# CONFIG_DMA_FENCE_TRACE is not set
++CONFIG_DMA_CMA=y
++
++#
++# Default contiguous memory area size:
++#
++CONFIG_CMA_SIZE_MBYTES=4
++CONFIG_CMA_SIZE_SEL_MBYTES=y
++# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
++# CONFIG_CMA_SIZE_SEL_MIN is not set
++# CONFIG_CMA_SIZE_SEL_MAX is not set
++CONFIG_CMA_ALIGNMENT=8
++CONFIG_GENERIC_ARCH_TOPOLOGY=y
++
++#
++# Bus devices
++#
++# CONFIG_BRCMSTB_GISB_ARB is not set
++# CONFIG_SIMPLE_PM_BUS is not set
++# CONFIG_VEXPRESS_CONFIG is not set
++# CONFIG_CONNECTOR is not set
++# CONFIG_GNSS is not set
++CONFIG_MTD=y
++# CONFIG_MTD_TESTS is not set
++# CONFIG_MTD_REDBOOT_PARTS is not set
++CONFIG_MTD_CMDLINE_PARTS=y
++# CONFIG_MTD_AFS_PARTS is not set
++CONFIG_MTD_OF_PARTS=y
++# CONFIG_MTD_AR7_PARTS is not set
++
++#
++# Partition parsers
++#
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_SM_FTL is not set
++# CONFIG_MTD_OOPS is not set
++# CONFIG_MTD_PARTITIONED_MASTER is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++# CONFIG_MTD_CFI is not set
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_INTEL_VR_NOR is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_PMC551 is not set
++# CONFIG_MTD_DATAFLASH is not set
++# CONFIG_MTD_M25P80 is not set
++# CONFIG_MTD_MCHP23K256 is not set
++# CONFIG_MTD_SST25L is not set
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++CONFIG_MTD_BLOCK2MTD=y
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOCG3 is not set
++# CONFIG_MTD_ONENAND is not set
++CONFIG_MTD_SPI_NAND_BSP=y
++# CONFIG_BSP_NAND_ECC_STATUS_REPORT is not set
++# CONFIG_BSP_NAND_FS_MAY_NO_YAFFS2 is not set
++CONFIG_MTD_NAND_ECC=y
++# CONFIG_MTD_NAND_ECC_SMC is not set
++CONFIG_MTD_NAND=y
++# CONFIG_MTD_NAND_ECC_BCH is not set
++# CONFIG_MTD_NAND_DENALI_PCI is not set
++# CONFIG_MTD_NAND_DENALI_DT is not set
++# CONFIG_MTD_NAND_GPIO is not set
++# CONFIG_MTD_NAND_RICOH is not set
++# CONFIG_MTD_NAND_DISKONCHIP is not set
++# CONFIG_MTD_NAND_DOCG4 is not set
++# CONFIG_MTD_NAND_CAFE is not set
++# CONFIG_MTD_NAND_NANDSIM is not set
++# CONFIG_MTD_NAND_BRCMNAND is not set
++# CONFIG_MTD_NAND_PLATFORM is not set
++CONFIG_MTD_SPI_NAND_FMC100=y
++# CONFIG_MTD_SPI_NAND is not set
++
++#
++# LPDDR & LPDDR2 PCM memory drivers
++#
++# CONFIG_MTD_LPDDR is not set
++CONFIG_MTD_SPI_NOR=y
++# CONFIG_MTD_MT81xx_NOR is not set
++# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set
++# CONFIG_SPI_CADENCE_QUADSPI is not set
++CONFIG_SPI_BSP_SFC=y
++# CONFIG_MTD_SPI_IDS is not set
++# CONFIG_CLOSE_SPI_8PIN_4IO is not set
++CONFIG_BSP_SPI_BLOCK_PROTECT=y
++CONFIG_MTD_UBI=y
++CONFIG_MTD_UBI_WL_THRESHOLD=4096
++CONFIG_MTD_UBI_BEB_LIMIT=20
++# CONFIG_MTD_UBI_FASTMAP is not set
++# CONFIG_MTD_UBI_GLUEBI is not set
++# CONFIG_MTD_UBI_BLOCK is not set
++CONFIG_DTC=y
++CONFIG_OF=y
++# CONFIG_OF_UNITTEST is not set
++CONFIG_OF_FLATTREE=y
++CONFIG_OF_EARLY_FLATTREE=y
++CONFIG_OF_KOBJ=y
++CONFIG_OF_ADDRESS=y
++CONFIG_OF_IRQ=y
++CONFIG_OF_NET=y
++CONFIG_OF_MDIO=y
++CONFIG_OF_RESERVED_MEM=y
++# CONFIG_OF_OVERLAY is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_NULL_BLK is not set
++# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
++# CONFIG_BLK_DEV_DAC960 is not set
++# CONFIG_BLK_DEV_UMEM is not set
++CONFIG_BLK_DEV_LOOP=y
++CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_DRBD is not set
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_SKD is not set
++# CONFIG_BLK_DEV_SX8 is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=65536
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++# CONFIG_BLK_DEV_RBD is not set
++# CONFIG_BLK_DEV_RSXX is not set
++
++#
++# NVME Support
++#
++# CONFIG_BLK_DEV_NVME is not set
++# CONFIG_NVME_FC is not set
++# CONFIG_NVME_TARGET is not set
++
++#
++# Misc devices
++#
++# CONFIG_AD525X_DPOT is not set
++# CONFIG_DUMMY_IRQ is not set
++# CONFIG_PHANTOM is not set
++# CONFIG_SGI_IOC4 is not set
++# CONFIG_TIFM_CORE is not set
++# CONFIG_ICS932S401 is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_HP_ILO is not set
++# CONFIG_APDS9802ALS is not set
++# CONFIG_ISL29003 is not set
++# CONFIG_ISL29020 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_SENSORS_BH1770 is not set
++# CONFIG_SENSORS_APDS990X is not set
++# CONFIG_HMC6352 is not set
++# CONFIG_DS1682 is not set
++# CONFIG_USB_SWITCH_FSA9480 is not set
++# CONFIG_LATTICE_ECP3_CONFIG is not set
++# CONFIG_SRAM is not set
++# CONFIG_PCI_ENDPOINT_TEST is not set
++# CONFIG_C2PORT is not set
++
++#
++# EEPROM support
++#
++# CONFIG_EEPROM_AT24 is not set
++# CONFIG_EEPROM_AT25 is not set
++# CONFIG_EEPROM_LEGACY is not set
++# CONFIG_EEPROM_MAX6875 is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_EEPROM_93XX46 is not set
++# CONFIG_EEPROM_IDT_89HPESX is not set
++# CONFIG_CB710_CORE is not set
++
++#
++# Texas Instruments shared transport line discipline
++#
++# CONFIG_TI_ST is not set
++# CONFIG_SENSORS_LIS3_SPI is not set
++# CONFIG_SENSORS_LIS3_I2C is not set
++# CONFIG_ALTERA_STAPL is not set
++
++#
++# Intel MIC & related support
++#
++
++#
++# Intel MIC Bus Driver
++#
++
++#
++# SCIF Bus Driver
++#
++
++#
++# VOP Bus Driver
++#
++
++#
++# Intel MIC Host Driver
++#
++
++#
++# Intel MIC Card Driver
++#
++
++#
++# SCIF Driver
++#
++
++#
++# Intel MIC Coprocessor State Management (COSM) Drivers
++#
++
++#
++# VOP Driver
++#
++# CONFIG_GENWQE is not set
++# CONFIG_ECHO is not set
++# CONFIG_MISC_RTSX_PCI is not set
++# CONFIG_MISC_RTSX_USB is not set
++
++#
++# SCSI device support
++#
++CONFIG_SCSI_MOD=y
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_DMA=y
++# CONFIG_SCSI_MQ_DEFAULT is not set
++CONFIG_SCSI_PROC_FS=y
++
++#
++# SCSI support type (disk, tape, CD-ROM)
++#
++CONFIG_BLK_DEV_SD=y
++# CONFIG_CHR_DEV_ST is not set
++# CONFIG_CHR_DEV_OSST is not set
++# CONFIG_BLK_DEV_SR is not set
++# CONFIG_CHR_DEV_SG is not set
++# CONFIG_CHR_DEV_SCH is not set
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++# CONFIG_SCSI_SCAN_ASYNC is not set
++
++#
++# SCSI Transports
++#
++# CONFIG_SCSI_SPI_ATTRS is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++# CONFIG_SCSI_SRP_ATTRS is not set
++CONFIG_SCSI_LOWLEVEL=y
++# CONFIG_ISCSI_TCP is not set
++# CONFIG_ISCSI_BOOT_SYSFS is not set
++# CONFIG_SCSI_CXGB3_ISCSI is not set
++# CONFIG_SCSI_CXGB4_ISCSI is not set
++# CONFIG_SCSI_BNX2_ISCSI is not set
++# CONFIG_BE2ISCSI is not set
++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
++# CONFIG_SCSI_HPSA is not set
++# CONFIG_SCSI_3W_9XXX is not set
++# CONFIG_SCSI_3W_SAS is not set
++# CONFIG_SCSI_ACARD is not set
++# CONFIG_SCSI_AACRAID is not set
++# CONFIG_SCSI_AIC7XXX is not set
++# CONFIG_SCSI_AIC79XX is not set
++# CONFIG_SCSI_AIC94XX is not set
++# CONFIG_SCSI_MVSAS is not set
++# CONFIG_SCSI_MVUMI is not set
++# CONFIG_SCSI_ADVANSYS is not set
++# CONFIG_SCSI_ARCMSR is not set
++# CONFIG_SCSI_ESAS2R is not set
++# CONFIG_MEGARAID_NEWGEN is not set
++# CONFIG_MEGARAID_LEGACY is not set
++# CONFIG_MEGARAID_SAS is not set
++# CONFIG_SCSI_MPT3SAS is not set
++# CONFIG_SCSI_MPT2SAS is not set
++# CONFIG_SCSI_SMARTPQI is not set
++# CONFIG_SCSI_UFSHCD is not set
++# CONFIG_SCSI_HPTIOP is not set
++# CONFIG_SCSI_SNIC is not set
++# CONFIG_SCSI_DMX3191D is not set
++# CONFIG_SCSI_IPS is not set
++# CONFIG_SCSI_INITIO is not set
++# CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_STEX is not set
++# CONFIG_SCSI_SYM53C8XX_2 is not set
++# CONFIG_SCSI_QLOGIC_1280 is not set
++# CONFIG_SCSI_QLA_ISCSI is not set
++# CONFIG_SCSI_DC395x is not set
++# CONFIG_SCSI_AM53C974 is not set
++# CONFIG_SCSI_WD719X is not set
++# CONFIG_SCSI_DEBUG is not set
++# CONFIG_SCSI_PMCRAID is not set
++# CONFIG_SCSI_PM8001 is not set
++# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
++# CONFIG_SCSI_DH is not set
++# CONFIG_SCSI_OSD_INITIATOR is not set
++CONFIG_HAVE_PATA_PLATFORM=y
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_TARGET_CORE is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_FIREWIRE_NOSY is not set
++CONFIG_NETDEVICES=y
++CONFIG_NET_CORE=y
++# CONFIG_BONDING is not set
++# CONFIG_DUMMY is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_NET_FC is not set
++# CONFIG_NET_TEAM is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_IPVLAN is not set
++# CONFIG_VXLAN is not set
++# CONFIG_GENEVE is not set
++# CONFIG_GTP is not set
++# CONFIG_MACSEC is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_TUN is not set
++# CONFIG_TUN_VNET_CROSS_LE is not set
++# CONFIG_VETH is not set
++# CONFIG_NLMON is not set
++# CONFIG_ARCNET is not set
++
++#
++# CAIF transport drivers
++#
++
++#
++# Distributed Switch Architecture drivers
++#
++CONFIG_ETHERNET=y
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_VENDOR_ADAPTEC is not set
++# CONFIG_NET_VENDOR_AGERE is not set
++# CONFIG_NET_VENDOR_ALACRITECH is not set
++# CONFIG_NET_VENDOR_ALTEON is not set
++# CONFIG_ALTERA_TSE is not set
++# CONFIG_NET_VENDOR_AMAZON is not set
++# CONFIG_NET_VENDOR_AMD is not set
++# CONFIG_NET_VENDOR_AQUANTIA is not set
++# CONFIG_NET_VENDOR_ARC is not set
++# CONFIG_NET_VENDOR_ATHEROS is not set
++# CONFIG_NET_VENDOR_AURORA is not set
++# CONFIG_NET_VENDOR_BROADCOM is not set
++# CONFIG_NET_VENDOR_BROCADE is not set
++# CONFIG_NET_VENDOR_CADENCE is not set
++# CONFIG_NET_VENDOR_CAVIUM is not set
++# CONFIG_NET_VENDOR_CHELSIO is not set
++# CONFIG_NET_VENDOR_CISCO is not set
++# CONFIG_NET_VENDOR_CORTINA is not set
++# CONFIG_DNET is not set
++# CONFIG_NET_VENDOR_DEC is not set
++# CONFIG_NET_VENDOR_DLINK is not set
++# CONFIG_NET_VENDOR_EMULEX is not set
++# CONFIG_NET_VENDOR_EZCHIP is not set
++# CONFIG_NET_VENDOR_HISILICON is not set
++# CONFIG_NET_VENDOR_HP is not set
++# CONFIG_NET_VENDOR_HUAWEI is not set
++# CONFIG_NET_VENDOR_INTEL is not set
++CONFIG_NET_VENDOR_BSP=y
++# CONFIG_BSP_FEMAC is not set
++CONFIG_ETH_GMAC=y
++CONFIG_GMAC_DDR_64BIT=y
++CONFIG_GMAC_DESC_4WORD=y
++CONFIG_GMAC_RXCSUM=y
++CONFIG_RX_FLOW_CTRL_SUPPORT=y
++CONFIG_TX_FLOW_CTRL_SUPPORT=y
++CONFIG_TX_FLOW_CTRL_PAUSE_TIME=0xFFFF
++CONFIG_TX_FLOW_CTRL_PAUSE_INTERVAL=0xFFFF
++CONFIG_TX_FLOW_CTRL_ACTIVE_THRESHOLD=16
++CONFIG_TX_FLOW_CTRL_DEACTIVE_THRESHOLD=32
++# CONFIG_JME is not set
++# CONFIG_NET_VENDOR_MARVELL is not set
++# CONFIG_NET_VENDOR_MELLANOX is not set
++# CONFIG_NET_VENDOR_MICREL is not set
++# CONFIG_NET_VENDOR_MICROCHIP is not set
++# CONFIG_NET_VENDOR_MICROSEMI is not set
++# CONFIG_NET_VENDOR_MYRI is not set
++# CONFIG_FEALNX is not set
++# CONFIG_NET_VENDOR_NATSEMI is not set
++# CONFIG_NET_VENDOR_NETERION is not set
++# CONFIG_NET_VENDOR_NETRONOME is not set
++# CONFIG_NET_VENDOR_NI is not set
++# CONFIG_NET_VENDOR_NVIDIA is not set
++# CONFIG_NET_VENDOR_OKI is not set
++# CONFIG_ETHOC is not set
++# CONFIG_NET_VENDOR_PACKET_ENGINES is not set
++# CONFIG_NET_VENDOR_QLOGIC is not set
++# CONFIG_NET_VENDOR_QUALCOMM is not set
++# CONFIG_NET_VENDOR_RDC is not set
++# CONFIG_NET_VENDOR_REALTEK is not set
++# CONFIG_NET_VENDOR_RENESAS is not set
++# CONFIG_NET_VENDOR_ROCKER is not set
++# CONFIG_NET_VENDOR_SAMSUNG is not set
++# CONFIG_NET_VENDOR_SEEQ is not set
++# CONFIG_NET_VENDOR_SOLARFLARE is not set
++# CONFIG_NET_VENDOR_SILAN is not set
++# CONFIG_NET_VENDOR_SIS is not set
++# CONFIG_NET_VENDOR_SMSC is not set
++# CONFIG_NET_VENDOR_SOCIONEXT is not set
++# CONFIG_NET_VENDOR_STMICRO is not set
++# CONFIG_NET_VENDOR_SUN is not set
++# CONFIG_NET_VENDOR_SYNOPSYS is not set
++# CONFIG_NET_VENDOR_TEHUTI is not set
++# CONFIG_NET_VENDOR_TI is not set
++# CONFIG_NET_VENDOR_VIA is not set
++# CONFIG_NET_VENDOR_WIZNET is not set
++# CONFIG_FDDI is not set
++# CONFIG_HIPPI is not set
++CONFIG_MDIO_DEVICE=y
++CONFIG_MDIO_BUS=y
++# CONFIG_MDIO_BCM_UNIMAC is not set
++# CONFIG_MDIO_BITBANG is not set
++# CONFIG_MDIO_BUS_MUX_GPIO is not set
++# CONFIG_MDIO_BUS_MUX_MMIOREG is not set
++# CONFIG_MDIO_HISI_FEMAC is not set
++# CONFIG_MDIO_BSP_FEMAC is not set
++CONFIG_MDIO_BSP_GEMAC=y
++# CONFIG_MDIO_MSCC_MIIM is not set
++# CONFIG_MDIO_OCTEON is not set
++# CONFIG_MDIO_THUNDER is not set
++CONFIG_PHYLIB=y
++CONFIG_SWPHY=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_AMD_PHY is not set
++# CONFIG_AQUANTIA_PHY is not set
++# CONFIG_AX88796B_PHY is not set
++# CONFIG_AT803X_PHY is not set
++# CONFIG_BCM7XXX_PHY is not set
++# CONFIG_BCM87XX_PHY is not set
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_CORTINA_PHY is not set
++# CONFIG_DAVICOM_PHY is not set
++# CONFIG_DP83822_PHY is not set
++# CONFIG_DP83TC811_PHY is not set
++# CONFIG_DP83848_PHY is not set
++# CONFIG_DP83867_PHY is not set
++CONFIG_FIXED_PHY=y
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_INTEL_XWAY_PHY is not set
++# CONFIG_LSI_ET1011C_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_MARVELL_PHY is not set
++# CONFIG_MARVELL_10G_PHY is not set
++# CONFIG_MICREL_PHY is not set
++# CONFIG_MICROCHIP_PHY is not set
++# CONFIG_MICROCHIP_T1_PHY is not set
++# CONFIG_MICROSEMI_PHY is not set
++# CONFIG_NATIONAL_PHY is not set
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_REALTEK_PHY is not set
++# CONFIG_RENESAS_PHY is not set
++# CONFIG_ROCKCHIP_PHY is not set
++# CONFIG_SMSC_PHY is not set
++# CONFIG_STE10XP is not set
++# CONFIG_TERANETICS_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++# CONFIG_XILINX_GMII2RGMII is not set
++# CONFIG_MICREL_KS8995MA is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++CONFIG_USB_NET_DRIVERS=y
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_RTL8152 is not set
++# CONFIG_USB_LAN78XX is not set
++# CONFIG_USB_USBNET is not set
++# CONFIG_USB_IPHETH is not set
++# CONFIG_WLAN is not set
++
++#
++# Enable WiMAX (Networking options) to see the WiMAX drivers
++#
++# CONFIG_WAN is not set
++# CONFIG_VMXNET3 is not set
++# CONFIG_NET_FAILOVER is not set
++# CONFIG_ISDN is not set
++# CONFIG_NVM is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++CONFIG_INPUT_FF_MEMLESS=y
++# CONFIG_INPUT_POLLDEV is not set
++# CONFIG_INPUT_SPARSEKMAP is not set
++# CONFIG_INPUT_MATRIXKMAP is not set
++
++#
++# Userland interfaces
++#
++CONFIG_INPUT_MOUSEDEV=y
++CONFIG_INPUT_MOUSEDEV_PSAUX=y
++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
++CONFIG_INPUT_JOYDEV=y
++CONFIG_INPUT_EVDEV=y
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++CONFIG_INPUT_KEYBOARD=y
++# CONFIG_KEYBOARD_ADP5588 is not set
++# CONFIG_KEYBOARD_ADP5589 is not set
++CONFIG_KEYBOARD_ATKBD=y
++# CONFIG_KEYBOARD_QT1070 is not set
++# CONFIG_KEYBOARD_QT2160 is not set
++# CONFIG_KEYBOARD_DLINK_DIR685 is not set
++# CONFIG_KEYBOARD_LKKBD is not set
++# CONFIG_KEYBOARD_GPIO is not set
++# CONFIG_KEYBOARD_GPIO_POLLED is not set
++# CONFIG_KEYBOARD_TCA6416 is not set
++# CONFIG_KEYBOARD_TCA8418 is not set
++# CONFIG_KEYBOARD_MATRIX is not set
++# CONFIG_KEYBOARD_LM8333 is not set
++# CONFIG_KEYBOARD_MAX7359 is not set
++# CONFIG_KEYBOARD_MCS is not set
++# CONFIG_KEYBOARD_MPR121 is not set
++# CONFIG_KEYBOARD_NEWTON is not set
++# CONFIG_KEYBOARD_OPENCORES is not set
++# CONFIG_KEYBOARD_SAMSUNG is not set
++# CONFIG_KEYBOARD_STOWAWAY is not set
++# CONFIG_KEYBOARD_SUNKBD is not set
++# CONFIG_KEYBOARD_OMAP4 is not set
++# CONFIG_KEYBOARD_XTKBD is not set
++# CONFIG_KEYBOARD_CAP11XX is not set
++# CONFIG_KEYBOARD_BCM is not set
++CONFIG_INPUT_MOUSE=y
++CONFIG_MOUSE_PS2=y
++CONFIG_MOUSE_PS2_ALPS=y
++CONFIG_MOUSE_PS2_BYD=y
++CONFIG_MOUSE_PS2_LOGIPS2PP=y
++CONFIG_MOUSE_PS2_SYNAPTICS=y
++CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y
++CONFIG_MOUSE_PS2_CYPRESS=y
++CONFIG_MOUSE_PS2_TRACKPOINT=y
++# CONFIG_MOUSE_PS2_ELANTECH is not set
++# CONFIG_MOUSE_PS2_SENTELIC is not set
++# CONFIG_MOUSE_PS2_TOUCHKIT is not set
++CONFIG_MOUSE_PS2_FOCALTECH=y
++CONFIG_MOUSE_PS2_SMBUS=y
++# CONFIG_MOUSE_SERIAL is not set
++# CONFIG_MOUSE_APPLETOUCH is not set
++# CONFIG_MOUSE_BCM5974 is not set
++# CONFIG_MOUSE_CYAPA is not set
++# CONFIG_MOUSE_ELAN_I2C is not set
++# CONFIG_MOUSE_VSXXXAA is not set
++# CONFIG_MOUSE_GPIO is not set
++# CONFIG_MOUSE_SYNAPTICS_I2C is not set
++# CONFIG_MOUSE_SYNAPTICS_USB is not set
++CONFIG_INPUT_JOYSTICK=y
++# CONFIG_JOYSTICK_ANALOG is not set
++# CONFIG_JOYSTICK_A3D is not set
++# CONFIG_JOYSTICK_ADI is not set
++# CONFIG_JOYSTICK_COBRA is not set
++# CONFIG_JOYSTICK_GF2K is not set
++# CONFIG_JOYSTICK_GRIP is not set
++# CONFIG_JOYSTICK_GRIP_MP is not set
++# CONFIG_JOYSTICK_GUILLEMOT is not set
++# CONFIG_JOYSTICK_INTERACT is not set
++# CONFIG_JOYSTICK_SIDEWINDER is not set
++# CONFIG_JOYSTICK_TMDC is not set
++# CONFIG_JOYSTICK_IFORCE is not set
++# CONFIG_JOYSTICK_WARRIOR is not set
++# CONFIG_JOYSTICK_MAGELLAN is not set
++# CONFIG_JOYSTICK_SPACEORB is not set
++# CONFIG_JOYSTICK_SPACEBALL is not set
++# CONFIG_JOYSTICK_STINGER is not set
++# CONFIG_JOYSTICK_TWIDJOY is not set
++# CONFIG_JOYSTICK_ZHENHUA is not set
++# CONFIG_JOYSTICK_AS5011 is not set
++# CONFIG_JOYSTICK_JOYDUMP is not set
++# CONFIG_JOYSTICK_XPAD is not set
++# CONFIG_JOYSTICK_PSXPAD_SPI is not set
++# CONFIG_JOYSTICK_PXRC is not set
++# CONFIG_INPUT_TABLET is not set
++# CONFIG_INPUT_TOUCHSCREEN is not set
++CONFIG_INPUT_MISC=y
++# CONFIG_INPUT_AD714X is not set
++# CONFIG_INPUT_ATMEL_CAPTOUCH is not set
++# CONFIG_INPUT_BMA150 is not set
++# CONFIG_INPUT_E3X0_BUTTON is not set
++# CONFIG_INPUT_MMA8450 is not set
++# CONFIG_INPUT_GP2A is not set
++# CONFIG_INPUT_GPIO_BEEPER is not set
++# CONFIG_INPUT_GPIO_DECODER is not set
++# CONFIG_INPUT_ATI_REMOTE2 is not set
++# CONFIG_INPUT_KEYSPAN_REMOTE is not set
++# CONFIG_INPUT_KXTJ9 is not set
++# CONFIG_INPUT_POWERMATE is not set
++# CONFIG_INPUT_YEALINK is not set
++# CONFIG_INPUT_CM109 is not set
++# CONFIG_INPUT_REGULATOR_HAPTIC is not set
++CONFIG_INPUT_UINPUT=y
++# CONFIG_INPUT_PCF8574 is not set
++# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
++# CONFIG_INPUT_ADXL34X is not set
++# CONFIG_INPUT_CMA3000 is not set
++# CONFIG_INPUT_DRV260X_HAPTICS is not set
++# CONFIG_INPUT_DRV2665_HAPTICS is not set
++# CONFIG_INPUT_DRV2667_HAPTICS is not set
++# CONFIG_RMI4_CORE is not set
++
++#
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_SERPORT=y
++# CONFIG_SERIO_AMBAKMI is not set
++# CONFIG_SERIO_PCIPS2 is not set
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_SERIO_ALTERA_PS2 is not set
++# CONFIG_SERIO_PS2MULT is not set
++# CONFIG_SERIO_ARC_PS2 is not set
++# CONFIG_SERIO_APBPS2 is not set
++# CONFIG_SERIO_GPIO_PS2 is not set
++# CONFIG_USERIO is not set
++CONFIG_GAMEPORT=y
++# CONFIG_GAMEPORT_NS558 is not set
++# CONFIG_GAMEPORT_L4 is not set
++# CONFIG_GAMEPORT_EMU10K1 is not set
++# CONFIG_GAMEPORT_FM801 is not set
++
++#
++# Character devices
++#
++CONFIG_TTY=y
++CONFIG_VT=y
++CONFIG_CONSOLE_TRANSLATIONS=y
++CONFIG_VT_CONSOLE=y
++CONFIG_VT_CONSOLE_SLEEP=y
++CONFIG_HW_CONSOLE=y
++# CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_UNIX98_PTYS=y
++# CONFIG_LEGACY_PTYS is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_NOZOMI is not set
++# CONFIG_N_GSM is not set
++# CONFIG_TRACE_SINK is not set
++CONFIG_LDISC_AUTOLOAD=y
++CONFIG_DEVMEM=y
++
++#
++# Serial drivers
++#
++CONFIG_SERIAL_EARLYCON=y
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++# CONFIG_SERIAL_AMBA_PL010 is not set
++CONFIG_SERIAL_AMBA_PL011=y
++CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
++# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set
++# CONFIG_SERIAL_MAX3100 is not set
++# CONFIG_SERIAL_MAX310X is not set
++# CONFIG_SERIAL_UARTLITE is not set
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++# CONFIG_SERIAL_JSM is not set
++# CONFIG_SERIAL_SCCNXP is not set
++# CONFIG_SERIAL_SC16IS7XX is not set
++# CONFIG_SERIAL_ALTERA_JTAGUART is not set
++# CONFIG_SERIAL_ALTERA_UART is not set
++# CONFIG_SERIAL_IFX6X60 is not set
++# CONFIG_SERIAL_XILINX_PS_UART is not set
++# CONFIG_SERIAL_ARC is not set
++# CONFIG_SERIAL_RP2 is not set
++# CONFIG_SERIAL_FSL_LPUART is not set
++# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set
++# CONFIG_SERIAL_DEV_BUS is not set
++# CONFIG_TTY_PRINTK is not set
++# CONFIG_HVC_DCC is not set
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_APPLICOM is not set
++
++#
++# PCMCIA character devices
++#
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++CONFIG_DEVPORT=y
++# CONFIG_XILLYBUS is not set
++
++#
++# I2C support
++#
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++# CONFIG_I2C_COMPAT is not set
++CONFIG_I2C_CHARDEV=y
++CONFIG_I2C_MUX=y
++
++#
++# Multiplexer I2C Chip support
++#
++# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set
++# CONFIG_I2C_MUX_GPIO is not set
++# CONFIG_I2C_MUX_GPMUX is not set
++# CONFIG_I2C_MUX_LTC4306 is not set
++# CONFIG_I2C_MUX_PCA9541 is not set
++# CONFIG_I2C_MUX_PCA954x is not set
++# CONFIG_I2C_MUX_PINCTRL is not set
++# CONFIG_I2C_MUX_REG is not set
++# CONFIG_I2C_DEMUX_PINCTRL is not set
++# CONFIG_I2C_MUX_MLXCPLD is not set
++# CONFIG_I2C_HELPER_AUTO is not set
++# CONFIG_I2C_SMBUS is not set
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++
++#
++# I2C Hardware Bus support
++#
++
++#
++# PC SMBus host controller drivers
++#
++# CONFIG_I2C_ALI1535 is not set
++# CONFIG_I2C_ALI1563 is not set
++# CONFIG_I2C_ALI15X3 is not set
++# CONFIG_I2C_AMD756 is not set
++# CONFIG_I2C_AMD8111 is not set
++# CONFIG_I2C_I801 is not set
++# CONFIG_I2C_ISCH is not set
++# CONFIG_I2C_PIIX4 is not set
++# CONFIG_I2C_NFORCE2 is not set
++# CONFIG_I2C_SIS5595 is not set
++# CONFIG_I2C_SIS630 is not set
++# CONFIG_I2C_SIS96X is not set
++# CONFIG_I2C_VIA is not set
++# CONFIG_I2C_VIAPRO is not set
++
++#
++# I2C system bus drivers (mostly embedded / system-on-chip)
++#
++# CONFIG_I2C_CADENCE is not set
++# CONFIG_I2C_CBUS_GPIO is not set
++# CONFIG_I2C_DESIGNWARE_PLATFORM is not set
++# CONFIG_I2C_DESIGNWARE_PCI is not set
++# CONFIG_I2C_EMEV2 is not set
++# CONFIG_I2C_GPIO is not set
++CONFIG_I2C_BSP=y
++# CONFIG_I2C_NOMADIK is not set
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
++# CONFIG_I2C_RK3X is not set
++# CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_THUNDERX is not set
++# CONFIG_I2C_XILINX is not set
++
++#
++# External I2C/SMBus adapter drivers
++#
++# CONFIG_I2C_DIOLAN_U2C is not set
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_ROBOTFUZZ_OSIF is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_TINY_USB is not set
++
++#
++# Other I2C/SMBus bus drivers
++#
++CONFIG_DMA_MSG_MIN_LEN=5
++CONFIG_DMA_MSG_MAX_LEN=4090
++# CONFIG_I2C_STUB is not set
++# CONFIG_I2C_SLAVE is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++CONFIG_SPI=y
++# CONFIG_SPI_DEBUG is not set
++CONFIG_SPI_MASTER=y
++# CONFIG_SPI_MEM is not set
++
++#
++# SPI Master Controller Drivers
++#
++# CONFIG_SPI_ALTERA is not set
++# CONFIG_SPI_AXI_SPI_ENGINE is not set
++# CONFIG_SPI_BITBANG is not set
++# CONFIG_SPI_CADENCE is not set
++# CONFIG_SPI_DESIGNWARE is not set
++# CONFIG_SPI_GPIO is not set
++# CONFIG_SPI_FSL_SPI is not set
++# CONFIG_SPI_OC_TINY is not set
++CONFIG_SPI_PL022=y
++# CONFIG_SPI_PXA2XX is not set
++# CONFIG_SPI_ROCKCHIP is not set
++# CONFIG_SPI_SC18IS602 is not set
++# CONFIG_SPI_THUNDERX is not set
++# CONFIG_SPI_XCOMM is not set
++# CONFIG_SPI_XILINX is not set
++# CONFIG_SPI_ZYNQMP_GQSPI is not set
++
++#
++# SPI Protocol Masters
++#
++CONFIG_SPI_SPIDEV=y
++# CONFIG_SPI_LOOPBACK_TEST is not set
++# CONFIG_SPI_TLE62X0 is not set
++# CONFIG_SPI_SLAVE is not set
++# CONFIG_SPMI is not set
++# CONFIG_HSI is not set
++# CONFIG_PPS is not set
++
++#
++# PTP clock support
++#
++# CONFIG_PTP_1588_CLOCK is not set
++
++#
++# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
++#
++CONFIG_PINCTRL=y
++CONFIG_GENERIC_PINCTRL_GROUPS=y
++CONFIG_PINMUX=y
++CONFIG_GENERIC_PINMUX_FUNCTIONS=y
++CONFIG_PINCONF=y
++CONFIG_GENERIC_PINCONF=y
++# CONFIG_DEBUG_PINCTRL is not set
++# CONFIG_PINCTRL_AMD is not set
++# CONFIG_PINCTRL_MCP23S08 is not set
++CONFIG_PINCTRL_SINGLE=y
++# CONFIG_PINCTRL_SX150X is not set
++CONFIG_GPIOLIB=y
++CONFIG_GPIOLIB_FASTPATH_LIMIT=512
++CONFIG_OF_GPIO=y
++CONFIG_GPIOLIB_IRQCHIP=y
++# CONFIG_DEBUG_GPIO is not set
++CONFIG_GPIO_SYSFS=y
++CONFIG_GPIO_GENERIC=y
++
++#
++# Memory mapped GPIO drivers
++#
++# CONFIG_GPIO_74XX_MMIO is not set
++# CONFIG_GPIO_ALTERA is not set
++# CONFIG_GPIO_DWAPB is not set
++# CONFIG_GPIO_FTGPIO010 is not set
++CONFIG_GPIO_GENERIC_PLATFORM=y
++# CONFIG_GPIO_GRGPIO is not set
++# CONFIG_GPIO_HLWD is not set
++# CONFIG_GPIO_MB86S7X is not set
++# CONFIG_GPIO_MOCKUP is not set
++CONFIG_GPIO_PL061=y
++# CONFIG_GPIO_SYSCON is not set
++# CONFIG_GPIO_XGENE is not set
++# CONFIG_GPIO_XILINX is not set
++
++#
++# I2C GPIO expanders
++#
++# CONFIG_GPIO_ADP5588 is not set
++# CONFIG_GPIO_ADNP is not set
++# CONFIG_GPIO_MAX7300 is not set
++# CONFIG_GPIO_MAX732X is not set
++# CONFIG_GPIO_PCA953X is not set
++# CONFIG_GPIO_PCF857X is not set
++# CONFIG_GPIO_TPIC2810 is not set
++
++#
++# MFD GPIO expanders
++#
++
++#
++# PCI GPIO expanders
++#
++# CONFIG_GPIO_BT8XX is not set
++# CONFIG_GPIO_PCI_IDIO_16 is not set
++# CONFIG_GPIO_PCIE_IDIO_24 is not set
++# CONFIG_GPIO_RDC321X is not set
++
++#
++# SPI GPIO expanders
++#
++# CONFIG_GPIO_74X164 is not set
++# CONFIG_GPIO_MAX3191X is not set
++# CONFIG_GPIO_MAX7301 is not set
++# CONFIG_GPIO_MC33880 is not set
++# CONFIG_GPIO_PISOSR is not set
++# CONFIG_GPIO_XRA1403 is not set
++
++#
++# USB GPIO expanders
++#
++# CONFIG_W1 is not set
++# CONFIG_POWER_AVS is not set
++CONFIG_POWER_RESET=y
++# CONFIG_POWER_RESET_BRCMSTB is not set
++# CONFIG_POWER_RESET_GPIO is not set
++# CONFIG_POWER_RESET_GPIO_RESTART is not set
++# CONFIG_POWER_RESET_BSP is not set
++# CONFIG_POWER_RESET_LTC2952 is not set
++# CONFIG_POWER_RESET_RESTART is not set
++# CONFIG_POWER_RESET_XGENE is not set
++# CONFIG_POWER_RESET_SYSCON is not set
++# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set
++# CONFIG_SYSCON_REBOOT_MODE is not set
++CONFIG_POWER_SUPPLY=y
++# CONFIG_POWER_SUPPLY_DEBUG is not set
++# CONFIG_PDA_POWER is not set
++# CONFIG_TEST_POWER is not set
++# CONFIG_CHARGER_ADP5061 is not set
++# CONFIG_BATTERY_DS2780 is not set
++# CONFIG_BATTERY_DS2781 is not set
++# CONFIG_BATTERY_DS2782 is not set
++# CONFIG_BATTERY_SBS is not set
++# CONFIG_CHARGER_SBS is not set
++# CONFIG_MANAGER_SBS is not set
++# CONFIG_BATTERY_BQ27XXX is not set
++# CONFIG_BATTERY_MAX17040 is not set
++# CONFIG_BATTERY_MAX17042 is not set
++# CONFIG_CHARGER_MAX8903 is not set
++# CONFIG_CHARGER_LP8727 is not set
++# CONFIG_CHARGER_GPIO is not set
++# CONFIG_CHARGER_MANAGER is not set
++# CONFIG_CHARGER_LTC3651 is not set
++# CONFIG_CHARGER_DETECTOR_MAX14656 is not set
++# CONFIG_CHARGER_BQ2415X is not set
++# CONFIG_CHARGER_BQ24257 is not set
++# CONFIG_CHARGER_BQ24735 is not set
++# CONFIG_CHARGER_BQ25890 is not set
++# CONFIG_CHARGER_SMB347 is not set
++# CONFIG_BATTERY_GAUGE_LTC2941 is not set
++# CONFIG_CHARGER_RT9455 is not set
++# CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
++# CONFIG_WATCHDOG is not set
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
++CONFIG_BCMA_POSSIBLE=y
++# CONFIG_BCMA is not set
++
++#
++# Multifunction device drivers
++#
++CONFIG_MFD_CORE=y
++# CONFIG_MFD_ACT8945A is not set
++# CONFIG_MFD_AS3711 is not set
++# CONFIG_MFD_AS3722 is not set
++# CONFIG_PMIC_ADP5520 is not set
++# CONFIG_MFD_AAT2870_CORE is not set
++# CONFIG_MFD_ATMEL_FLEXCOM is not set
++# CONFIG_MFD_ATMEL_HLCDC is not set
++# CONFIG_MFD_BCM590XX is not set
++# CONFIG_MFD_BD9571MWV is not set
++# CONFIG_MFD_AXP20X_I2C is not set
++# CONFIG_MFD_CROS_EC is not set
++# CONFIG_MFD_MADERA is not set
++# CONFIG_PMIC_DA903X is not set
++# CONFIG_MFD_DA9052_SPI is not set
++# CONFIG_MFD_DA9052_I2C is not set
++# CONFIG_MFD_DA9055 is not set
++# CONFIG_MFD_DA9062 is not set
++# CONFIG_MFD_DA9063 is not set
++# CONFIG_MFD_DA9150 is not set
++# CONFIG_MFD_DLN2 is not set
++# CONFIG_MFD_MC13XXX_SPI is not set
++# CONFIG_MFD_MC13XXX_I2C is not set
++# CONFIG_MFD_HI6421_PMIC is not set
++CONFIG_MFD_BSP_FMC=y
++# CONFIG_HTC_PASIC3 is not set
++# CONFIG_HTC_I2CPLD is not set
++# CONFIG_LPC_ICH is not set
++# CONFIG_LPC_SCH is not set
++# CONFIG_MFD_JANZ_CMODIO is not set
++# CONFIG_MFD_KEMPLD is not set
++# CONFIG_MFD_88PM800 is not set
++# CONFIG_MFD_88PM805 is not set
++# CONFIG_MFD_88PM860X is not set
++# CONFIG_MFD_MAX14577 is not set
++# CONFIG_MFD_MAX77620 is not set
++# CONFIG_MFD_MAX77686 is not set
++# CONFIG_MFD_MAX77693 is not set
++# CONFIG_MFD_MAX77843 is not set
++# CONFIG_MFD_MAX8907 is not set
++# CONFIG_MFD_MAX8925 is not set
++# CONFIG_MFD_MAX8997 is not set
++# CONFIG_MFD_MAX8998 is not set
++# CONFIG_MFD_MT6397 is not set
++# CONFIG_MFD_MENF21BMC is not set
++# CONFIG_EZX_PCAP is not set
++# CONFIG_MFD_CPCAP is not set
++# CONFIG_MFD_VIPERBOARD is not set
++# CONFIG_MFD_RETU is not set
++# CONFIG_MFD_PCF50633 is not set
++# CONFIG_MFD_RDC321X is not set
++# CONFIG_MFD_RT5033 is not set
++# CONFIG_MFD_RC5T583 is not set
++# CONFIG_MFD_RK808 is not set
++# CONFIG_MFD_RN5T618 is not set
++# CONFIG_MFD_SEC_CORE is not set
++# CONFIG_MFD_SI476X_CORE is not set
++# CONFIG_MFD_SM501 is not set
++# CONFIG_MFD_SKY81452 is not set
++# CONFIG_MFD_SMSC is not set
++# CONFIG_ABX500_CORE is not set
++# CONFIG_MFD_STMPE is not set
++CONFIG_MFD_SYSCON=y
++# CONFIG_MFD_TI_AM335X_TSCADC is not set
++# CONFIG_MFD_LP3943 is not set
++# CONFIG_MFD_LP8788 is not set
++# CONFIG_MFD_TI_LMU is not set
++# CONFIG_MFD_PALMAS is not set
++# CONFIG_TPS6105X is not set
++# CONFIG_TPS65010 is not set
++# CONFIG_TPS6507X is not set
++# CONFIG_MFD_TPS65086 is not set
++# CONFIG_MFD_TPS65090 is not set
++# CONFIG_MFD_TPS65217 is not set
++# CONFIG_MFD_TI_LP873X is not set
++# CONFIG_MFD_TI_LP87565 is not set
++# CONFIG_MFD_TPS65218 is not set
++# CONFIG_MFD_TPS6586X is not set
++# CONFIG_MFD_TPS65910 is not set
++# CONFIG_MFD_TPS65912_I2C is not set
++# CONFIG_MFD_TPS65912_SPI is not set
++# CONFIG_MFD_TPS80031 is not set
++# CONFIG_TWL4030_CORE is not set
++# CONFIG_TWL6040_CORE is not set
++# CONFIG_MFD_WL1273_CORE is not set
++# CONFIG_MFD_LM3533 is not set
++# CONFIG_MFD_TC3589X is not set
++# CONFIG_MFD_VX855 is not set
++# CONFIG_MFD_ARIZONA_I2C is not set
++# CONFIG_MFD_ARIZONA_SPI is not set
++# CONFIG_MFD_WM8400 is not set
++# CONFIG_MFD_WM831X_I2C is not set
++# CONFIG_MFD_WM831X_SPI is not set
++# CONFIG_MFD_WM8350_I2C is not set
++# CONFIG_MFD_WM8994 is not set
++# CONFIG_MFD_ROHM_BD718XX is not set
++CONFIG_REGULATOR=y
++# CONFIG_REGULATOR_DEBUG is not set
++# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
++# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
++# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
++# CONFIG_REGULATOR_88PG86X is not set
++# CONFIG_REGULATOR_ACT8865 is not set
++# CONFIG_REGULATOR_AD5398 is not set
++# CONFIG_REGULATOR_ANATOP is not set
++# CONFIG_REGULATOR_DA9210 is not set
++# CONFIG_REGULATOR_DA9211 is not set
++# CONFIG_REGULATOR_FAN53555 is not set
++# CONFIG_REGULATOR_GPIO is not set
++# CONFIG_REGULATOR_ISL9305 is not set
++# CONFIG_REGULATOR_ISL6271A is not set
++# CONFIG_REGULATOR_LP3971 is not set
++# CONFIG_REGULATOR_LP3972 is not set
++# CONFIG_REGULATOR_LP872X is not set
++# CONFIG_REGULATOR_LP8755 is not set
++# CONFIG_REGULATOR_LTC3589 is not set
++# CONFIG_REGULATOR_LTC3676 is not set
++# CONFIG_REGULATOR_MAX1586 is not set
++# CONFIG_REGULATOR_MAX8649 is not set
++# CONFIG_REGULATOR_MAX8660 is not set
++# CONFIG_REGULATOR_MAX8952 is not set
++# CONFIG_REGULATOR_MT6311 is not set
++# CONFIG_REGULATOR_PFUZE100 is not set
++# CONFIG_REGULATOR_PV88060 is not set
++# CONFIG_REGULATOR_PV88080 is not set
++# CONFIG_REGULATOR_PV88090 is not set
++# CONFIG_REGULATOR_SY8106A is not set
++# CONFIG_REGULATOR_TPS51632 is not set
++# CONFIG_REGULATOR_TPS62360 is not set
++# CONFIG_REGULATOR_TPS65023 is not set
++# CONFIG_REGULATOR_TPS6507X is not set
++# CONFIG_REGULATOR_TPS65132 is not set
++# CONFIG_REGULATOR_TPS6524X is not set
++# CONFIG_REGULATOR_VCTRL is not set
++# CONFIG_RC_CORE is not set
++CONFIG_MEDIA_SUPPORT=y
++
++#
++# Multimedia core support
++#
++CONFIG_MEDIA_CAMERA_SUPPORT=y
++# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set
++# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set
++# CONFIG_MEDIA_RADIO_SUPPORT is not set
++# CONFIG_MEDIA_SDR_SUPPORT is not set
++# CONFIG_MEDIA_CEC_SUPPORT is not set
++# CONFIG_MEDIA_CONTROLLER is not set
++CONFIG_VIDEO_DEV=y
++CONFIG_VIDEO_V4L2=y
++# CONFIG_VIDEO_ADV_DEBUG is not set
++# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
++
++#
++# Media drivers
++#
++CONFIG_MEDIA_USB_SUPPORT=y
++
++#
++# Webcam devices
++#
++CONFIG_USB_VIDEO_CLASS=y
++CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
++CONFIG_USB_GSPCA=m
++# CONFIG_USB_M5602 is not set
++# CONFIG_USB_STV06XX is not set
++# CONFIG_USB_GL860 is not set
++# CONFIG_USB_GSPCA_BENQ is not set
++# CONFIG_USB_GSPCA_CONEX is not set
++# CONFIG_USB_GSPCA_CPIA1 is not set
++# CONFIG_USB_GSPCA_DTCS033 is not set
++# CONFIG_USB_GSPCA_ETOMS is not set
++# CONFIG_USB_GSPCA_FINEPIX is not set
++# CONFIG_USB_GSPCA_JEILINJ is not set
++# CONFIG_USB_GSPCA_JL2005BCD is not set
++# CONFIG_USB_GSPCA_KINECT is not set
++# CONFIG_USB_GSPCA_KONICA is not set
++# CONFIG_USB_GSPCA_MARS is not set
++# CONFIG_USB_GSPCA_MR97310A is not set
++# CONFIG_USB_GSPCA_NW80X is not set
++# CONFIG_USB_GSPCA_OV519 is not set
++# CONFIG_USB_GSPCA_OV534 is not set
++# CONFIG_USB_GSPCA_OV534_9 is not set
++# CONFIG_USB_GSPCA_PAC207 is not set
++# CONFIG_USB_GSPCA_PAC7302 is not set
++# CONFIG_USB_GSPCA_PAC7311 is not set
++# CONFIG_USB_GSPCA_SE401 is not set
++# CONFIG_USB_GSPCA_SN9C2028 is not set
++# CONFIG_USB_GSPCA_SN9C20X is not set
++# CONFIG_USB_GSPCA_SONIXB is not set
++# CONFIG_USB_GSPCA_SONIXJ is not set
++# CONFIG_USB_GSPCA_SPCA500 is not set
++# CONFIG_USB_GSPCA_SPCA501 is not set
++# CONFIG_USB_GSPCA_SPCA505 is not set
++# CONFIG_USB_GSPCA_SPCA506 is not set
++# CONFIG_USB_GSPCA_SPCA508 is not set
++# CONFIG_USB_GSPCA_SPCA561 is not set
++# CONFIG_USB_GSPCA_SPCA1528 is not set
++# CONFIG_USB_GSPCA_SQ905 is not set
++# CONFIG_USB_GSPCA_SQ905C is not set
++# CONFIG_USB_GSPCA_SQ930X is not set
++# CONFIG_USB_GSPCA_STK014 is not set
++# CONFIG_USB_GSPCA_STK1135 is not set
++# CONFIG_USB_GSPCA_STV0680 is not set
++# CONFIG_USB_GSPCA_SUNPLUS is not set
++# CONFIG_USB_GSPCA_T613 is not set
++# CONFIG_USB_GSPCA_TOPRO is not set
++# CONFIG_USB_GSPCA_TOUPTEK is not set
++# CONFIG_USB_GSPCA_TV8532 is not set
++# CONFIG_USB_GSPCA_VC032X is not set
++# CONFIG_USB_GSPCA_VICAM is not set
++# CONFIG_USB_GSPCA_XIRLINK_CIT is not set
++# CONFIG_USB_GSPCA_ZC3XX is not set
++# CONFIG_USB_PWC is not set
++# CONFIG_VIDEO_CPIA2 is not set
++# CONFIG_USB_ZR364XX is not set
++# CONFIG_USB_STKWEBCAM is not set
++# CONFIG_USB_S2255 is not set
++# CONFIG_VIDEO_USBTV is not set
++
++#
++# Webcam, TV (analog/digital) USB devices
++#
++# CONFIG_VIDEO_EM28XX is not set
++# CONFIG_MEDIA_PCI_SUPPORT is not set
++CONFIG_V4L_PLATFORM_DRIVERS=y
++# CONFIG_VIDEO_CAFE_CCIC is not set
++# CONFIG_VIDEO_CADENCE is not set
++# CONFIG_SOC_CAMERA is not set
++# CONFIG_V4L_MEM2MEM_DRIVERS is not set
++# CONFIG_V4L_TEST_DRIVERS is not set
++
++#
++# Supported MMC/SDIO adapters
++#
++# CONFIG_CYPRESS_FIRMWARE is not set
++CONFIG_VIDEOBUF2_CORE=y
++CONFIG_VIDEOBUF2_V4L2=y
++CONFIG_VIDEOBUF2_MEMOPS=y
++CONFIG_VIDEOBUF2_VMALLOC=y
++
++#
++# Media ancillary drivers (tuners, sensors, i2c, spi, frontends)
++#
++CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
++
++#
++# Audio decoders, processors and mixers
++#
++
++#
++# RDS decoders
++#
++
++#
++# Video decoders
++#
++
++#
++# Video and audio decoders
++#
++
++#
++# Video encoders
++#
++
++#
++# Camera sensor devices
++#
++
++#
++# Flash devices
++#
++
++#
++# Video improvement chips
++#
++
++#
++# Audio/Video compression chips
++#
++
++#
++# SDR tuner chips
++#
++
++#
++# Miscellaneous helper chips
++#
++
++#
++# Sensors used on soc_camera driver
++#
++
++#
++# Media SPI Adapters
++#
++
++#
++# Tools to develop new frontends
++#
++
++#
++# Graphics support
++#
++CONFIG_VGA_ARB=y
++CONFIG_VGA_ARB_MAX_GPUS=16
++# CONFIG_DRM is not set
++# CONFIG_DRM_DP_CEC is not set
++
++#
++# ACP (Audio CoProcessor) Configuration
++#
++
++#
++# AMD Library routines
++#
++
++#
++# Frame buffer Devices
++#
++CONFIG_FB_CMDLINE=y
++CONFIG_FB_NOTIFY=y
++CONFIG_FB=y
++# CONFIG_FIRMWARE_EDID is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
++# CONFIG_FB_MODE_HELPERS is not set
++# CONFIG_FB_TILEBLITTING is not set
++
++#
++# Frame buffer hardware drivers
++#
++# CONFIG_FB_CIRRUS is not set
++# CONFIG_FB_PM2 is not set
++# CONFIG_FB_ARMCLCD is not set
++# CONFIG_FB_CYBER2000 is not set
++# CONFIG_FB_ASILIANT is not set
++# CONFIG_FB_IMSTT is not set
++# CONFIG_FB_OPENCORES is not set
++# CONFIG_FB_S1D13XXX is not set
++# CONFIG_FB_NVIDIA is not set
++# CONFIG_FB_RIVA is not set
++# CONFIG_FB_I740 is not set
++# CONFIG_FB_MATROX is not set
++# CONFIG_FB_RADEON is not set
++# CONFIG_FB_ATY128 is not set
++# CONFIG_FB_ATY is not set
++# CONFIG_FB_S3 is not set
++# CONFIG_FB_SAVAGE is not set
++# CONFIG_FB_SIS is not set
++# CONFIG_FB_NEOMAGIC is not set
++# CONFIG_FB_KYRO is not set
++# CONFIG_FB_3DFX is not set
++# CONFIG_FB_VOODOO1 is not set
++# CONFIG_FB_VT8623 is not set
++# CONFIG_FB_TRIDENT is not set
++# CONFIG_FB_ARK is not set
++# CONFIG_FB_PM3 is not set
++# CONFIG_FB_CARMINE is not set
++# CONFIG_FB_SMSCUFX is not set
++# CONFIG_FB_UDL is not set
++# CONFIG_FB_IBM_GXT4500 is not set
++# CONFIG_FB_VIRTUAL is not set
++# CONFIG_FB_METRONOME is not set
++# CONFIG_FB_MB862XX is not set
++# CONFIG_FB_BROADSHEET is not set
++# CONFIG_FB_SIMPLE is not set
++# CONFIG_FB_SSD1307 is not set
++# CONFIG_FB_SM712 is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Console display driver support
++#
++CONFIG_DUMMY_CONSOLE=y
++CONFIG_DUMMY_CONSOLE_COLUMNS=80
++CONFIG_DUMMY_CONSOLE_ROWS=25
++# CONFIG_FRAMEBUFFER_CONSOLE is not set
++# CONFIG_LOGO is not set
++CONFIG_SOUND=y
++CONFIG_SND=y
++CONFIG_SND_TIMER=y
++CONFIG_SND_PCM=y
++# CONFIG_SND_OSSEMUL is not set
++CONFIG_SND_PCM_TIMER=y
++# CONFIG_SND_DYNAMIC_MINORS is not set
++CONFIG_SND_SUPPORT_OLD_API=y
++CONFIG_SND_PROC_FS=y
++CONFIG_SND_VERBOSE_PROCFS=y
++# CONFIG_SND_VERBOSE_PRINTK is not set
++# CONFIG_SND_DEBUG is not set
++# CONFIG_SND_SEQUENCER is not set
++CONFIG_SND_DRIVERS=y
++# CONFIG_SND_DUMMY is not set
++# CONFIG_SND_ALOOP is not set
++# CONFIG_SND_MTPAV is not set
++# CONFIG_SND_SERIAL_U16550 is not set
++# CONFIG_SND_MPU401 is not set
++CONFIG_SND_PCI=y
++# CONFIG_SND_AD1889 is not set
++# CONFIG_SND_ATIIXP is not set
++# CONFIG_SND_ATIIXP_MODEM is not set
++# CONFIG_SND_AU8810 is not set
++# CONFIG_SND_AU8820 is not set
++# CONFIG_SND_AU8830 is not set
++# CONFIG_SND_AW2 is not set
++# CONFIG_SND_BT87X is not set
++# CONFIG_SND_CA0106 is not set
++# CONFIG_SND_CMIPCI is not set
++# CONFIG_SND_OXYGEN is not set
++# CONFIG_SND_CS4281 is not set
++# CONFIG_SND_CS46XX is not set
++# CONFIG_SND_CTXFI is not set
++# CONFIG_SND_DARLA20 is not set
++# CONFIG_SND_GINA20 is not set
++# CONFIG_SND_LAYLA20 is not set
++# CONFIG_SND_DARLA24 is not set
++# CONFIG_SND_GINA24 is not set
++# CONFIG_SND_LAYLA24 is not set
++# CONFIG_SND_MONA is not set
++# CONFIG_SND_MIA is not set
++# CONFIG_SND_ECHO3G is not set
++# CONFIG_SND_INDIGO is not set
++# CONFIG_SND_INDIGOIO is not set
++# CONFIG_SND_INDIGODJ is not set
++# CONFIG_SND_INDIGOIOX is not set
++# CONFIG_SND_INDIGODJX is not set
++# CONFIG_SND_ENS1370 is not set
++# CONFIG_SND_ENS1371 is not set
++# CONFIG_SND_FM801 is not set
++# CONFIG_SND_HDSP is not set
++# CONFIG_SND_HDSPM is not set
++# CONFIG_SND_ICE1724 is not set
++# CONFIG_SND_INTEL8X0 is not set
++# CONFIG_SND_INTEL8X0M is not set
++# CONFIG_SND_KORG1212 is not set
++# CONFIG_SND_LOLA is not set
++# CONFIG_SND_LX6464ES is not set
++# CONFIG_SND_MIXART is not set
++# CONFIG_SND_NM256 is not set
++# CONFIG_SND_PCXHR is not set
++# CONFIG_SND_RIPTIDE is not set
++# CONFIG_SND_RME32 is not set
++# CONFIG_SND_RME96 is not set
++# CONFIG_SND_RME9652 is not set
++# CONFIG_SND_SE6X is not set
++# CONFIG_SND_VIA82XX is not set
++# CONFIG_SND_VIA82XX_MODEM is not set
++# CONFIG_SND_VIRTUOSO is not set
++# CONFIG_SND_VX222 is not set
++# CONFIG_SND_YMFPCI is not set
++
++#
++# HD-Audio
++#
++# CONFIG_SND_HDA_INTEL is not set
++CONFIG_SND_HDA_PREALLOC_SIZE=64
++CONFIG_SND_SPI=y
++CONFIG_SND_USB=y
++# CONFIG_SND_USB_AUDIO is not set
++# CONFIG_SND_USB_UA101 is not set
++# CONFIG_SND_USB_CAIAQ is not set
++# CONFIG_SND_USB_6FIRE is not set
++# CONFIG_SND_USB_HIFACE is not set
++# CONFIG_SND_BCD2000 is not set
++# CONFIG_SND_USB_POD is not set
++# CONFIG_SND_USB_PODHD is not set
++# CONFIG_SND_USB_TONEPORT is not set
++# CONFIG_SND_USB_VARIAX is not set
++# CONFIG_SND_SOC is not set
++
++#
++# HID support
++#
++CONFIG_HID=y
++# CONFIG_HID_BATTERY_STRENGTH is not set
++# CONFIG_HIDRAW is not set
++# CONFIG_UHID is not set
++CONFIG_HID_GENERIC=y
++
++#
++# Special HID drivers
++#
++CONFIG_HID_A4TECH=y
++# CONFIG_HID_ACCUTOUCH is not set
++# CONFIG_HID_ACRUX is not set
++CONFIG_HID_APPLE=y
++# CONFIG_HID_APPLEIR is not set
++# CONFIG_HID_AUREAL is not set
++CONFIG_HID_BELKIN=y
++# CONFIG_HID_BETOP_FF is not set
++CONFIG_HID_CHERRY=y
++CONFIG_HID_CHICONY=y
++# CONFIG_HID_COUGAR is not set
++# CONFIG_HID_PRODIKEYS is not set
++# CONFIG_HID_CMEDIA is not set
++CONFIG_HID_CYPRESS=y
++# CONFIG_HID_DRAGONRISE is not set
++# CONFIG_HID_EMS_FF is not set
++# CONFIG_HID_ELECOM is not set
++# CONFIG_HID_ELO is not set
++CONFIG_HID_EZKEY=y
++# CONFIG_HID_GEMBIRD is not set
++# CONFIG_HID_GFRM is not set
++# CONFIG_HID_HOLTEK is not set
++# CONFIG_HID_KEYTOUCH is not set
++# CONFIG_HID_KYE is not set
++# CONFIG_HID_UCLOGIC is not set
++# CONFIG_HID_WALTOP is not set
++# CONFIG_HID_GYRATION is not set
++# CONFIG_HID_ICADE is not set
++# CONFIG_HID_ITE is not set
++# CONFIG_HID_JABRA is not set
++# CONFIG_HID_TWINHAN is not set
++CONFIG_HID_KENSINGTON=y
++# CONFIG_HID_LCPOWER is not set
++# CONFIG_HID_LENOVO is not set
++CONFIG_HID_LOGITECH=y
++# CONFIG_HID_LOGITECH_HIDPP is not set
++# CONFIG_LOGITECH_FF is not set
++# CONFIG_LOGIRUMBLEPAD2_FF is not set
++# CONFIG_LOGIG940_FF is not set
++# CONFIG_LOGIWHEELS_FF is not set
++# CONFIG_HID_MAGICMOUSE is not set
++# CONFIG_HID_MAYFLASH is not set
++# CONFIG_HID_REDRAGON is not set
++CONFIG_HID_MICROSOFT=y
++CONFIG_HID_MONTEREY=y
++# CONFIG_HID_MULTITOUCH is not set
++# CONFIG_HID_NTI is not set
++# CONFIG_HID_NTRIG is not set
++# CONFIG_HID_ORTEK is not set
++# CONFIG_HID_PANTHERLORD is not set
++# CONFIG_HID_PENMOUNT is not set
++# CONFIG_HID_PETALYNX is not set
++# CONFIG_HID_PICOLCD is not set
++# CONFIG_HID_PLANTRONICS is not set
++# CONFIG_HID_PRIMAX is not set
++# CONFIG_HID_RETRODE is not set
++# CONFIG_HID_ROCCAT is not set
++# CONFIG_HID_SAITEK is not set
++# CONFIG_HID_SAMSUNG is not set
++# CONFIG_HID_SPEEDLINK is not set
++# CONFIG_HID_STEAM is not set
++# CONFIG_HID_STEELSERIES is not set
++# CONFIG_HID_SUNPLUS is not set
++# CONFIG_HID_RMI is not set
++# CONFIG_HID_GREENASIA is not set
++# CONFIG_HID_SMARTJOYPLUS is not set
++# CONFIG_HID_TIVO is not set
++# CONFIG_HID_TOPSEED is not set
++# CONFIG_HID_THRUSTMASTER is not set
++# CONFIG_HID_UDRAW_PS3 is not set
++# CONFIG_HID_WACOM is not set
++# CONFIG_HID_XINMO is not set
++# CONFIG_HID_ZEROPLUS is not set
++# CONFIG_HID_ZYDACRON is not set
++# CONFIG_HID_SENSOR_HUB is not set
++# CONFIG_HID_ALPS is not set
++
++#
++# USB HID support
++#
++CONFIG_USB_HID=y
++# CONFIG_HID_PID is not set
++# CONFIG_USB_HIDDEV is not set
++
++#
++# I2C HID support
++#
++# CONFIG_I2C_HID is not set
++CONFIG_USB_OHCI_LITTLE_ENDIAN=y
++CONFIG_USB_SUPPORT=y
++CONFIG_USB_COMMON=y
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB=y
++CONFIG_USB_PCI=y
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
++
++#
++# Miscellaneous USB options
++#
++CONFIG_USB_DEFAULT_PERSIST=y
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_OTG is not set
++# CONFIG_USB_OTG_WHITELIST is not set
++# CONFIG_USB_OTG_BLACKLIST_HUB is not set
++# CONFIG_USB_MON is not set
++# CONFIG_USB_WUSB_CBAF is not set
++
++#
++# USB Host Controller Drivers
++#
++# CONFIG_USB_C67X00_HCD is not set
++CONFIG_USB_XHCI_HCD=y
++# CONFIG_USB_XHCI_DBGCAP is not set
++CONFIG_USB_XHCI_PCI=y
++CONFIG_USB_XHCI_PLATFORM=y
++# CONFIG_USB_EHCI_HCD is not set
++# CONFIG_USB_OXU210HP_HCD is not set
++# CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_FOTG210_HCD is not set
++# CONFIG_USB_MAX3421_HCD is not set
++# CONFIG_USB_OHCI_HCD is not set
++# CONFIG_USB_UHCI_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++# CONFIG_USB_HCD_TEST_MODE is not set
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
++# CONFIG_USB_WDM is not set
++# CONFIG_USB_TMC is not set
++
++#
++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
++#
++
++#
++# also be needed; see USB_STORAGE Help for more info
++#
++CONFIG_USB_STORAGE=y
++# CONFIG_USB_STORAGE_DEBUG is not set
++# CONFIG_USB_STORAGE_REALTEK is not set
++# CONFIG_USB_STORAGE_DATAFAB is not set
++# CONFIG_USB_STORAGE_FREECOM is not set
++# CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_USBAT is not set
++# CONFIG_USB_STORAGE_SDDR09 is not set
++# CONFIG_USB_STORAGE_SDDR55 is not set
++# CONFIG_USB_STORAGE_JUMPSHOT is not set
++# CONFIG_USB_STORAGE_ALAUDA is not set
++# CONFIG_USB_STORAGE_ONETOUCH is not set
++# CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
++# CONFIG_USB_STORAGE_ENE_UB6250 is not set
++# CONFIG_USB_UAS is not set
++
++#
++# USB Imaging devices
++#
++# CONFIG_USB_MDC800 is not set
++# CONFIG_USB_MICROTEK is not set
++# CONFIG_USBIP_CORE is not set
++# CONFIG_USB_MUSB_HDRC is not set
++CONFIG_USB_DWC3=y
++# CONFIG_USB_DWC3_HOST is not set
++CONFIG_USB_DWC3_GADGET=y
++
++#
++# Platform Glue Driver Support
++#
++# CONFIG_USB_DWC3_HAPS is not set
++# CONFIG_USB_DWC3_OF_SIMPLE is not set
++# CONFIG_USB_DWC2 is not set
++# CONFIG_USB_CHIPIDEA is not set
++# CONFIG_USB_ISP1760 is not set
++
++#
++# USB port drivers
++#
++# CONFIG_USB_SERIAL is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_SEVSEG is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
++# CONFIG_USB_TEST is not set
++# CONFIG_USB_EHSET_TEST_FIXTURE is not set
++# CONFIG_USB_ISIGHTFW is not set
++# CONFIG_USB_YUREX is not set
++# CONFIG_USB_EZUSB_FX2 is not set
++# CONFIG_USB_HUB_USB251XB is not set
++# CONFIG_USB_HSIC_USB3503 is not set
++# CONFIG_USB_HSIC_USB4604 is not set
++# CONFIG_USB_LINK_LAYER_TEST is not set
++
++#
++# USB Physical Layer drivers
++#
++# CONFIG_NOP_USB_XCEIV is not set
++# CONFIG_USB_GPIO_VBUS is not set
++# CONFIG_USB_ISP1301 is not set
++# CONFIG_USB_ULPI is not set
++CONFIG_USB_GADGET=y
++# CONFIG_USB_GADGET_DEBUG is not set
++# CONFIG_USB_GADGET_DEBUG_FILES is not set
++CONFIG_USB_GADGET_VBUS_DRAW=2
++CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
++# CONFIG_U_SERIAL_CONSOLE is not set
++
++#
++# USB Peripheral Controller
++#
++# CONFIG_USB_FOTG210_UDC is not set
++# CONFIG_USB_GR_UDC is not set
++# CONFIG_USB_R8A66597 is not set
++# CONFIG_USB_PXA27X is not set
++# CONFIG_USB_MV_UDC is not set
++# CONFIG_USB_MV_U3D is not set
++# CONFIG_USB_SNP_UDC_PLAT is not set
++# CONFIG_USB_M66592 is not set
++# CONFIG_USB_BDC_UDC is not set
++# CONFIG_USB_AMD5536UDC is not set
++# CONFIG_USB_NET2272 is not set
++# CONFIG_USB_NET2280 is not set
++# CONFIG_USB_GOKU is not set
++# CONFIG_USB_EG20T is not set
++# CONFIG_USB_GADGET_XILINX is not set
++# CONFIG_USB_DUMMY_HCD is not set
++CONFIG_USB_LIBCOMPOSITE=y
++CONFIG_USB_F_ACM=y
++CONFIG_USB_U_SERIAL=y
++CONFIG_USB_U_ETHER=y
++CONFIG_USB_U_AUDIO=y
++CONFIG_USB_F_RNDIS=y
++CONFIG_USB_F_MASS_STORAGE=y
++CONFIG_USB_F_UAC1=y
++CONFIG_USB_F_UVC=y
++CONFIG_USB_CONFIGFS=y
++# CONFIG_USB_CONFIGFS_SERIAL is not set
++CONFIG_USB_CONFIGFS_ACM=y
++# CONFIG_USB_CONFIGFS_OBEX is not set
++# CONFIG_USB_CONFIGFS_NCM is not set
++# CONFIG_USB_CONFIGFS_ECM is not set
++# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set
++CONFIG_USB_CONFIGFS_RNDIS=y
++# CONFIG_USB_CONFIGFS_EEM is not set
++CONFIG_USB_CONFIGFS_MASS_STORAGE=y
++# CONFIG_USB_CONFIGFS_F_LB_SS is not set
++# CONFIG_USB_CONFIGFS_F_FS is not set
++CONFIG_USB_CONFIGFS_F_UAC1=y
++# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set
++# CONFIG_USB_CONFIGFS_F_UAC2 is not set
++# CONFIG_USB_CONFIGFS_F_MIDI is not set
++# CONFIG_USB_CONFIGFS_F_HID is not set
++CONFIG_USB_CONFIGFS_F_UVC=y
++# CONFIG_USB_CONFIGFS_F_PRINTER is not set
++CONFIG_MPP_TO_GADGET_UVC=y
++# CONFIG_TYPEC is not set
++# CONFIG_USB_ROLE_SWITCH is not set
++# CONFIG_USB_ULPI_BUS is not set
++# CONFIG_UWB is not set
++CONFIG_MMC=y
++CONFIG_PWRSEQ_EMMC=y
++CONFIG_PWRSEQ_SIMPLE=y
++CONFIG_MMC_BLOCK=y
++CONFIG_MMC_BLOCK_MINORS=8
++# CONFIG_SDIO_UART is not set
++# CONFIG_MMC_TEST is not set
++
++#
++# MMC/SD/SDIO Host Controller Drivers
++#
++# CONFIG_MMC_DEBUG is not set
++# CONFIG_MMC_ARMMMCI is not set
++CONFIG_MMC_SDHCI=y
++CONFIG_MMC_SDHCI_IO_ACCESSORS=y
++# CONFIG_MMC_SDHCI_PCI is not set
++CONFIG_MMC_SDHCI_PLTFM=y
++# CONFIG_MMC_SDHCI_OF_ARASAN is not set
++# CONFIG_MMC_SDHCI_OF_AT91 is not set
++# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set
++# CONFIG_MMC_SDHCI_CADENCE is not set
++CONFIG_MMC_SDHCI_BSP=y
++# CONFIG_MMC_SDHCI_F_SDH30 is not set
++# CONFIG_MMC_TIFM_SD is not set
++# CONFIG_MMC_SPI is not set
++# CONFIG_MMC_CB710 is not set
++# CONFIG_MMC_VIA_SDMMC is not set
++# CONFIG_MMC_DW is not set
++# CONFIG_MMC_VUB300 is not set
++# CONFIG_MMC_USHC is not set
++# CONFIG_MMC_USDHI6ROL0 is not set
++# CONFIG_MMC_CQHCI is not set
++# CONFIG_MMC_TOSHIBA_PCI is not set
++# CONFIG_MMC_MTK is not set
++# CONFIG_MMC_SDHCI_XENON is not set
++# CONFIG_MMC_SDHCI_OMAP is not set
++# CONFIG_MMC_CQ_HCI is not set
++# CONFIG_MEMSTICK is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_ACCESSIBILITY is not set
++# CONFIG_INFINIBAND is not set
++CONFIG_EDAC_SUPPORT=y
++CONFIG_RTC_LIB=y
++CONFIG_RTC_CLASS=y
++CONFIG_RTC_HCTOSYS=y
++CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
++CONFIG_RTC_SYSTOHC=y
++CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
++# CONFIG_RTC_DEBUG is not set
++CONFIG_RTC_NVMEM=y
++
++#
++# RTC interfaces
++#
++CONFIG_RTC_INTF_SYSFS=y
++CONFIG_RTC_INTF_PROC=y
++CONFIG_RTC_INTF_DEV=y
++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
++# CONFIG_RTC_DRV_TEST is not set
++
++#
++# I2C RTC drivers
++#
++# CONFIG_RTC_DRV_ABB5ZES3 is not set
++# CONFIG_RTC_DRV_ABX80X is not set
++# CONFIG_RTC_DRV_DS1307 is not set
++# CONFIG_RTC_DRV_DS1374 is not set
++# CONFIG_RTC_DRV_DS1672 is not set
++# CONFIG_RTC_DRV_HYM8563 is not set
++# CONFIG_RTC_DRV_MAX6900 is not set
++# CONFIG_RTC_DRV_RS5C372 is not set
++# CONFIG_RTC_DRV_ISL1208 is not set
++# CONFIG_RTC_DRV_ISL12022 is not set
++# CONFIG_RTC_DRV_ISL12026 is not set
++# CONFIG_RTC_DRV_X1205 is not set
++# CONFIG_RTC_DRV_PCF8523 is not set
++# CONFIG_RTC_DRV_PCF85063 is not set
++# CONFIG_RTC_DRV_PCF85363 is not set
++# CONFIG_RTC_DRV_PCF8563 is not set
++# CONFIG_RTC_DRV_PCF8583 is not set
++# CONFIG_RTC_DRV_M41T80 is not set
++# CONFIG_RTC_DRV_BQ32K is not set
++# CONFIG_RTC_DRV_S35390A is not set
++# CONFIG_RTC_DRV_FM3130 is not set
++# CONFIG_RTC_DRV_RX8010 is not set
++# CONFIG_RTC_DRV_RX8581 is not set
++# CONFIG_RTC_DRV_RX8025 is not set
++# CONFIG_RTC_DRV_EM3027 is not set
++# CONFIG_RTC_DRV_RV8803 is not set
++
++#
++# SPI RTC drivers
++#
++# CONFIG_RTC_DRV_M41T93 is not set
++# CONFIG_RTC_DRV_M41T94 is not set
++# CONFIG_RTC_DRV_DS1302 is not set
++# CONFIG_RTC_DRV_DS1305 is not set
++# CONFIG_RTC_DRV_DS1343 is not set
++# CONFIG_RTC_DRV_DS1347 is not set
++# CONFIG_RTC_DRV_DS1390 is not set
++# CONFIG_RTC_DRV_MAX6916 is not set
++# CONFIG_RTC_DRV_R9701 is not set
++# CONFIG_RTC_DRV_RX4581 is not set
++# CONFIG_RTC_DRV_RX6110 is not set
++# CONFIG_RTC_DRV_RS5C348 is not set
++# CONFIG_RTC_DRV_MAX6902 is not set
++# CONFIG_RTC_DRV_PCF2123 is not set
++# CONFIG_RTC_DRV_MCP795 is not set
++CONFIG_RTC_I2C_AND_SPI=y
++
++#
++# SPI and I2C RTC drivers
++#
++# CONFIG_RTC_DRV_DS3232 is not set
++# CONFIG_RTC_DRV_PCF2127 is not set
++# CONFIG_RTC_DRV_RV3029C2 is not set
++
++#
++# Platform RTC drivers
++#
++# CONFIG_RTC_DRV_BSP is not set
++# CONFIG_RTC_DRV_DS1286 is not set
++# CONFIG_RTC_DRV_DS1511 is not set
++# CONFIG_RTC_DRV_DS1553 is not set
++# CONFIG_RTC_DRV_DS1685_FAMILY is not set
++# CONFIG_RTC_DRV_DS1742 is not set
++# CONFIG_RTC_DRV_DS2404 is not set
++# CONFIG_RTC_DRV_STK17TA8 is not set
++# CONFIG_RTC_DRV_M48T86 is not set
++# CONFIG_RTC_DRV_M48T35 is not set
++# CONFIG_RTC_DRV_M48T59 is not set
++# CONFIG_RTC_DRV_MSM6242 is not set
++# CONFIG_RTC_DRV_BQ4802 is not set
++# CONFIG_RTC_DRV_RP5C01 is not set
++# CONFIG_RTC_DRV_V3020 is not set
++# CONFIG_RTC_DRV_ZYNQMP is not set
++
++#
++# on-CPU RTC drivers
++#
++# CONFIG_RTC_DRV_PL030 is not set
++# CONFIG_RTC_DRV_PL031 is not set
++# CONFIG_RTC_DRV_FTRTC010 is not set
++# CONFIG_RTC_DRV_SNVS is not set
++# CONFIG_RTC_DRV_R7301 is not set
++
++#
++# HID Sensor RTC drivers
++#
++# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set
++CONFIG_DMADEVICES=y
++# CONFIG_DMADEVICES_DEBUG is not set
++
++#
++# DMA Devices
++#
++CONFIG_DMA_ENGINE=y
++CONFIG_DMA_VIRTUAL_CHANNELS=y
++CONFIG_DMA_OF=y
++# CONFIG_ALTERA_MSGDMA is not set
++# CONFIG_AMBA_PL08X is not set
++# CONFIG_DW_AXI_DMAC is not set
++# CONFIG_FSL_EDMA is not set
++# CONFIG_INTEL_IDMA64 is not set
++CONFIG_EDMACV310=y
++# CONFIG_MV_XOR_V2 is not set
++# CONFIG_PL330_DMA is not set
++# CONFIG_XILINX_DMA is not set
++# CONFIG_XILINX_ZYNQMP_DMA is not set
++# CONFIG_QCOM_HIDMA_MGMT is not set
++# CONFIG_QCOM_HIDMA is not set
++# CONFIG_DW_DMAC is not set
++# CONFIG_DW_DMAC_PCI is not set
++
++#
++# DMA Clients
++#
++# CONFIG_ASYNC_TX_DMA is not set
++# CONFIG_DMATEST is not set
++
++#
++# DMABUF options
++#
++# CONFIG_SYNC_FILE is not set
++# CONFIG_AUXDISPLAY is not set
++# CONFIG_UIO is not set
++# CONFIG_VFIO is not set
++# CONFIG_VIRT_DRIVERS is not set
++# CONFIG_VIRTIO_MENU is not set
++
++#
++# Microsoft Hyper-V guest support
++#
++# CONFIG_STAGING is not set
++# CONFIG_GOLDFISH is not set
++# CONFIG_CHROME_PLATFORMS is not set
++CONFIG_CLKDEV_LOOKUP=y
++CONFIG_HAVE_CLK_PREPARE=y
++CONFIG_COMMON_CLK=y
++
++#
++# Common Clock Framework
++#
++# CONFIG_COMMON_CLK_VERSATILE is not set
++# CONFIG_CLK_HSDK is not set
++# CONFIG_COMMON_CLK_MAX9485 is not set
++# CONFIG_COMMON_CLK_SI5351 is not set
++# CONFIG_COMMON_CLK_SI514 is not set
++# CONFIG_COMMON_CLK_SI544 is not set
++# CONFIG_COMMON_CLK_SI570 is not set
++# CONFIG_COMMON_CLK_CDCE706 is not set
++# CONFIG_COMMON_CLK_CDCE925 is not set
++# CONFIG_COMMON_CLK_CS2000_CP is not set
++# CONFIG_CLK_QORIQ is not set
++# CONFIG_COMMON_CLK_XGENE is not set
++# CONFIG_COMMON_CLK_VC5 is not set
++CONFIG_COMMON_CLK_SS928V100=y
++CONFIG_RESET_BSP=y
++# CONFIG_HWSPINLOCK is not set
++
++#
++# Clock Source drivers
++#
++CONFIG_TIMER_OF=y
++CONFIG_TIMER_PROBE=y
++CONFIG_CLKSRC_MMIO=y
++CONFIG_ARM_ARCH_TIMER=y
++CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
++CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y
++# CONFIG_ARM_ARCH_TIMER_VCT_ACCESS is not set
++# CONFIG_FSL_ERRATUM_A008585 is not set
++CONFIG_HISILICON_ERRATUM_161010101=y
++CONFIG_ARM64_ERRATUM_858921=y
++CONFIG_ARM_TIMER_SP804=y
++# CONFIG_TIMER_BSP_SP804 is not set
++# CONFIG_MAILBOX is not set
++CONFIG_IOMMU_API=y
++CONFIG_IOMMU_SUPPORT=y
++
++#
++# Generic IOMMU Pagetable Support
++#
++CONFIG_IOMMU_IO_PGTABLE=y
++CONFIG_IOMMU_IO_PGTABLE_LPAE=y
++# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set
++# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set
++
++#
++# Generic PASID table support
++#
++CONFIG_IOMMU_PASID_TABLE=y
++CONFIG_ARM_SMMU_V3_CONTEXT=y
++# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
++CONFIG_IOMMU_IOVA=y
++CONFIG_OF_IOMMU=y
++CONFIG_IOMMU_DMA=y
++CONFIG_IOMMU_SVA=y
++CONFIG_IOMMU_PAGE_FAULT=y
++# CONFIG_ARM_SMMU is not set
++CONFIG_ARM_SMMU_V3=y
++
++#
++# Remoteproc drivers
++#
++# CONFIG_REMOTEPROC is not set
++
++#
++# Rpmsg drivers
++#
++# CONFIG_RPMSG_VIRTIO is not set
++
++#
++# SOC (System On Chip) specific Drivers
++#
++
++#
++# Amlogic SoC drivers
++#
++
++#
++# Broadcom SoC drivers
++#
++# CONFIG_SOC_BRCMSTB is not set
++
++#
++# NXP/Freescale QorIQ SoC drivers
++#
++
++#
++# i.MX SoC drivers
++#
++
++#
++# Qualcomm SoC drivers
++#
++# CONFIG_SOC_TI is not set
++
++#
++# Xilinx SoC drivers
++#
++# CONFIG_XILINX_VCU is not set
++CONFIG_PM_DEVFREQ=y
++
++#
++# DEVFREQ Governors
++#
++CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
++# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set
++# CONFIG_DEVFREQ_GOV_POWERSAVE is not set
++# CONFIG_DEVFREQ_GOV_USERSPACE is not set
++# CONFIG_DEVFREQ_GOV_PASSIVE is not set
++
++#
++# DEVFREQ Drivers
++#
++# CONFIG_PM_DEVFREQ_EVENT is not set
++# CONFIG_EXTCON is not set
++# CONFIG_MEMORY is not set
++# CONFIG_IIO is not set
++# CONFIG_NTB is not set
++# CONFIG_VME_BUS is not set
++# CONFIG_PWM is not set
++
++#
++# IRQ chip support
++#
++CONFIG_IRQCHIP=y
++CONFIG_ARM_GIC=y
++CONFIG_ARM_GIC_MAX_NR=1
++CONFIG_ARM_GIC_V2M=y
++CONFIG_ARM_GIC_V3=y
++CONFIG_ARM_GIC_V3_ITS=y
++CONFIG_ARM_GIC_V3_ITS_PCI=y
++CONFIG_HISILICON_IRQ_MBIGEN=y
++CONFIG_PARTITION_PERCPU=y
++# CONFIG_IPACK_BUS is not set
++CONFIG_RESET_CONTROLLER=y
++# CONFIG_RESET_TI_SYSCON is not set
++# CONFIG_FMC is not set
++
++#
++# PHY Subsystem
++#
++CONFIG_GENERIC_PHY=y
++# CONFIG_PHY_XGENE is not set
++# CONFIG_BCM_KONA_USB2_PHY is not set
++# CONFIG_PHY_PXA_28NM_HSIC is not set
++# CONFIG_PHY_PXA_28NM_USB2 is not set
++# CONFIG_PHY_MAPPHONE_MDM6600 is not set
++CONFIG_VENDOR_USB_PHY=y
++CONFIG_PHY_BSP_USB3=y
++CONFIG_BSP_USB_PHY=y
++CONFIG_USB_MODE_OPTION=y
++# CONFIG_USB_DRD0_IN_HOST is not set
++CONFIG_USB_DRD0_IN_DEVICE=y
++# CONFIG_POWERCAP is not set
++# CONFIG_MCB is not set
++# CONFIG_RAS is not set
++# CONFIG_LIBNVDIMM is not set
++# CONFIG_DAX is not set
++CONFIG_NVMEM=y
++
++#
++# HW tracing support
++#
++# CONFIG_STM is not set
++# CONFIG_INTEL_TH is not set
++# CONFIG_FPGA is not set
++# CONFIG_FSI is not set
++# CONFIG_TEE is not set
++CONFIG_PM_OPP=y
++# CONFIG_SIOX is not set
++# CONFIG_SLIMBUS is not set
++
++#
++# Vendor driver support
++#
++# CONFIG_CMA_MEM_SHARED is not set
++# CONFIG_CMA_ADVANCE_SHARE is not set
++CONFIG_VENDOR_NPU=y
++
++#
++# File systems
++#
++CONFIG_DCACHE_WORD_ACCESS=y
++CONFIG_FS_IOMAP=y
++# CONFIG_EXT2_FS is not set
++# CONFIG_EXT3_FS is not set
++CONFIG_EXT4_FS=y
++CONFIG_EXT4_USE_FOR_EXT2=y
++CONFIG_EXT4_FS_POSIX_ACL=y
++CONFIG_EXT4_FS_SECURITY=y
++# CONFIG_EXT4_ENCRYPTION is not set
++# CONFIG_EXT4_DEBUG is not set
++CONFIG_JBD2=y
++# CONFIG_JBD2_DEBUG is not set
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++CONFIG_XFS_FS=y
++CONFIG_XFS_QUOTA=y
++CONFIG_XFS_POSIX_ACL=y
++CONFIG_XFS_RT=y
++# CONFIG_XFS_ONLINE_SCRUB is not set
++# CONFIG_XFS_WARN is not set
++# CONFIG_XFS_DEBUG is not set
++# CONFIG_GFS2_FS is not set
++# CONFIG_OCFS2_FS is not set
++# CONFIG_BTRFS_FS is not set
++# CONFIG_NILFS2_FS is not set
++# CONFIG_F2FS_FS is not set
++# CONFIG_FS_DAX is not set
++CONFIG_FS_POSIX_ACL=y
++CONFIG_EXPORTFS=y
++# CONFIG_EXPORTFS_BLOCK_OPS is not set
++CONFIG_FILE_LOCKING=y
++CONFIG_MANDATORY_FILE_LOCKING=y
++# CONFIG_FS_ENCRYPTION is not set
++CONFIG_FSNOTIFY=y
++CONFIG_DNOTIFY=y
++CONFIG_INOTIFY_USER=y
++# CONFIG_FANOTIFY is not set
++CONFIG_QUOTA=y
++# CONFIG_QUOTA_NETLINK_INTERFACE is not set
++CONFIG_PRINT_QUOTA_WARNING=y
++# CONFIG_QUOTA_DEBUG is not set
++CONFIG_QUOTA_TREE=m
++CONFIG_QFMT_V1=m
++CONFIG_QFMT_V2=m
++CONFIG_QUOTACTL=y
++CONFIG_AUTOFS4_FS=m
++CONFIG_AUTOFS_FS=m
++CONFIG_FUSE_FS=y
++# CONFIG_CUSE is not set
++# CONFIG_OVERLAY_FS is not set
++
++#
++# Caches
++#
++# CONFIG_FSCACHE is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++CONFIG_ISO9660_FS=y
++# CONFIG_JOLIET is not set
++# CONFIG_ZISOFS is not set
++CONFIG_UDF_FS=y
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++CONFIG_VFAT_FS=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++# CONFIG_FAT_DEFAULT_UTF8 is not set
++# CONFIG_NTFS_FS is not set
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++# CONFIG_PROC_KCORE is not set
++CONFIG_PROC_SYSCTL=y
++CONFIG_PROC_PAGE_MONITOR=y
++# CONFIG_PROC_CHILDREN is not set
++CONFIG_KERNFS=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++CONFIG_TMPFS_POSIX_ACL=y
++CONFIG_TMPFS_XATTR=y
++# CONFIG_HUGETLBFS is not set
++CONFIG_MEMFD_CREATE=y
++CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
++CONFIG_CONFIGFS_FS=y
++CONFIG_MISC_FILESYSTEMS=y
++# CONFIG_ORANGEFS_FS is not set
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++CONFIG_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
++# CONFIG_JFFS2_SUMMARY is not set
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++CONFIG_JFFS2_RTIME=y
++CONFIG_UBIFS_FS=y
++# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
++CONFIG_UBIFS_FS_LZO=y
++CONFIG_UBIFS_FS_ZLIB=y
++# CONFIG_UBIFS_ATIME_SUPPORT is not set
++CONFIG_UBIFS_FS_XATTR=y
++# CONFIG_UBIFS_FS_ENCRYPTION is not set
++CONFIG_UBIFS_FS_SECURITY=y
++CONFIG_CRAMFS=y
++CONFIG_CRAMFS_BLOCKDEV=y
++# CONFIG_CRAMFS_MTD is not set
++CONFIG_SQUASHFS=y
++CONFIG_SQUASHFS_FILE_CACHE=y
++# CONFIG_SQUASHFS_FILE_DIRECT is not set
++CONFIG_SQUASHFS_DECOMP_SINGLE=y
++# CONFIG_SQUASHFS_DECOMP_MULTI is not set
++# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set
++# CONFIG_SQUASHFS_XATTR is not set
++CONFIG_SQUASHFS_ZLIB=y
++# CONFIG_SQUASHFS_LZ4 is not set
++CONFIG_SQUASHFS_LZO=y
++CONFIG_SQUASHFS_XZ=y
++# CONFIG_SQUASHFS_ZSTD is not set
++# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
++# CONFIG_SQUASHFS_EMBEDDED is not set
++CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
++# CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_OMFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_QNX6FS_FS is not set
++# CONFIG_ROMFS_FS is not set
++# CONFIG_PSTORE is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V2=y
++CONFIG_NFS_V3=y
++CONFIG_NFS_V3_ACL=y
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_SWAP is not set
++# CONFIG_NFSD is not set
++CONFIG_GRACE_PERIOD=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_ACL_SUPPORT=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_DEBUG is not set
++# CONFIG_CEPH_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=y
++CONFIG_NLS_CODEPAGE_737=m
++CONFIG_NLS_CODEPAGE_775=m
++CONFIG_NLS_CODEPAGE_850=m
++CONFIG_NLS_CODEPAGE_852=m
++CONFIG_NLS_CODEPAGE_855=m
++CONFIG_NLS_CODEPAGE_857=m
++CONFIG_NLS_CODEPAGE_860=m
++CONFIG_NLS_CODEPAGE_861=m
++CONFIG_NLS_CODEPAGE_862=m
++CONFIG_NLS_CODEPAGE_863=m
++CONFIG_NLS_CODEPAGE_864=m
++CONFIG_NLS_CODEPAGE_865=m
++CONFIG_NLS_CODEPAGE_866=m
++CONFIG_NLS_CODEPAGE_869=m
++CONFIG_NLS_CODEPAGE_936=y
++CONFIG_NLS_CODEPAGE_950=m
++CONFIG_NLS_CODEPAGE_932=m
++CONFIG_NLS_CODEPAGE_949=m
++CONFIG_NLS_CODEPAGE_874=m
++CONFIG_NLS_ISO8859_8=m
++CONFIG_NLS_CODEPAGE_1250=m
++CONFIG_NLS_CODEPAGE_1251=m
++CONFIG_NLS_ASCII=y
++CONFIG_NLS_ISO8859_1=y
++CONFIG_NLS_ISO8859_2=m
++CONFIG_NLS_ISO8859_3=m
++CONFIG_NLS_ISO8859_4=m
++CONFIG_NLS_ISO8859_5=m
++CONFIG_NLS_ISO8859_6=m
++CONFIG_NLS_ISO8859_7=m
++CONFIG_NLS_ISO8859_9=m
++CONFIG_NLS_ISO8859_13=m
++CONFIG_NLS_ISO8859_14=m
++CONFIG_NLS_ISO8859_15=m
++CONFIG_NLS_KOI8_R=m
++CONFIG_NLS_KOI8_U=m
++# CONFIG_NLS_MAC_ROMAN is not set
++# CONFIG_NLS_MAC_CELTIC is not set
++# CONFIG_NLS_MAC_CENTEURO is not set
++# CONFIG_NLS_MAC_CROATIAN is not set
++# CONFIG_NLS_MAC_CYRILLIC is not set
++# CONFIG_NLS_MAC_GAELIC is not set
++# CONFIG_NLS_MAC_GREEK is not set
++# CONFIG_NLS_MAC_ICELAND is not set
++# CONFIG_NLS_MAC_INUIT is not set
++# CONFIG_NLS_MAC_ROMANIAN is not set
++# CONFIG_NLS_MAC_TURKISH is not set
++CONFIG_NLS_UTF8=y
++# CONFIG_DLM is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY_DMESG_RESTRICT is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITYFS is not set
++CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
++# CONFIG_HARDENED_USERCOPY is not set
++# CONFIG_FORTIFY_SOURCE is not set
++# CONFIG_STATIC_USERMODEHELPER is not set
++CONFIG_DEFAULT_SECURITY_DAC=y
++CONFIG_DEFAULT_SECURITY=""
++CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_ALGAPI2=y
++CONFIG_CRYPTO_AEAD=m
++CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_BLKCIPHER2=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_HASH2=y
++CONFIG_CRYPTO_RNG=m
++CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_RNG_DEFAULT=m
++CONFIG_CRYPTO_AKCIPHER2=y
++CONFIG_CRYPTO_KPP2=y
++CONFIG_CRYPTO_ACOMP2=y
++# CONFIG_CRYPTO_RSA is not set
++# CONFIG_CRYPTO_DH is not set
++# CONFIG_CRYPTO_ECDH is not set
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_MANAGER2=y
++# CONFIG_CRYPTO_USER is not set
++CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_NULL=m
++CONFIG_CRYPTO_NULL2=y
++# CONFIG_CRYPTO_PCRYPT is not set
++CONFIG_CRYPTO_WORKQUEUE=y
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_MCRYPTD is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++CONFIG_CRYPTO_CCM=m
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_CHACHA20POLY1305 is not set
++# CONFIG_CRYPTO_AEGIS128 is not set
++# CONFIG_CRYPTO_AEGIS128L is not set
++# CONFIG_CRYPTO_AEGIS256 is not set
++# CONFIG_CRYPTO_MORUS640 is not set
++# CONFIG_CRYPTO_MORUS1280 is not set
++CONFIG_CRYPTO_SEQIV=m
++CONFIG_CRYPTO_ECHAINIV=m
++
++#
++# Block modes
++#
++# CONFIG_CRYPTO_CBC is not set
++# CONFIG_CRYPTO_CFB is not set
++CONFIG_CRYPTO_CTR=m
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=y
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_KEYWRAP is not set
++
++#
++# Hash modes
++#
++CONFIG_CRYPTO_CMAC=y
++CONFIG_CRYPTO_HMAC=m
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_VMAC is not set
++
++#
++# Digest
++#
++CONFIG_CRYPTO_CRC32C=y
++# CONFIG_CRYPTO_CRC32 is not set
++# CONFIG_CRYPTO_CRCT10DIF is not set
++# CONFIG_CRYPTO_GHASH is not set
++# CONFIG_CRYPTO_POLY1305 is not set
++# CONFIG_CRYPTO_MD4 is not set
++# CONFIG_CRYPTO_MD5 is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_RMD128 is not set
++# CONFIG_CRYPTO_RMD160 is not set
++# CONFIG_CRYPTO_RMD256 is not set
++# CONFIG_CRYPTO_RMD320 is not set
++# CONFIG_CRYPTO_SHA1 is not set
++CONFIG_CRYPTO_SHA256=y
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_SHA3 is not set
++# CONFIG_CRYPTO_SM3 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_WP512 is not set
++
++#
++# Ciphers
++#
++CONFIG_CRYPTO_AES=y
++# CONFIG_CRYPTO_AES_TI is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++CONFIG_CRYPTO_ARC4=y
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_DES is not set
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_CHACHA20 is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_SM4 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++
++#
++# Compression
++#
++CONFIG_CRYPTO_DEFLATE=y
++CONFIG_CRYPTO_LZO=y
++# CONFIG_CRYPTO_842 is not set
++# CONFIG_CRYPTO_LZ4 is not set
++# CONFIG_CRYPTO_LZ4HC is not set
++# CONFIG_CRYPTO_ZSTD is not set
++
++#
++# Random Number Generation
++#
++# CONFIG_CRYPTO_ANSI_CPRNG is not set
++CONFIG_CRYPTO_DRBG_MENU=m
++CONFIG_CRYPTO_DRBG_HMAC=y
++# CONFIG_CRYPTO_DRBG_HASH is not set
++# CONFIG_CRYPTO_DRBG_CTR is not set
++CONFIG_CRYPTO_DRBG=m
++CONFIG_CRYPTO_JITTERENTROPY=m
++# CONFIG_CRYPTO_USER_API_HASH is not set
++# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
++# CONFIG_CRYPTO_USER_API_RNG is not set
++# CONFIG_CRYPTO_USER_API_AEAD is not set
++CONFIG_CRYPTO_HW=y
++# CONFIG_CRYPTO_DEV_CCP is not set
++# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set
++# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set
++# CONFIG_CRYPTO_DEV_CCREE is not set
++# CONFIG_CRYPTO_DEV_HISI_SEC is not set
++
++#
++# Certificates for signature checking
++#
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_HAVE_ARCH_BITREVERSE=y
++CONFIG_RATIONAL=y
++CONFIG_GENERIC_STRNCPY_FROM_USER=y
++CONFIG_GENERIC_STRNLEN_USER=y
++CONFIG_GENERIC_NET_UTILS=y
++CONFIG_GENERIC_PCI_IOMAP=y
++CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
++CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
++# CONFIG_INDIRECT_PIO is not set
++CONFIG_CRC_CCITT=y
++CONFIG_CRC16=y
++# CONFIG_CRC_T10DIF is not set
++CONFIG_CRC_ITU_T=y
++CONFIG_CRC32=y
++# CONFIG_CRC32_SELFTEST is not set
++CONFIG_CRC32_SLICEBY8=y
++# CONFIG_CRC32_SLICEBY4 is not set
++# CONFIG_CRC32_SARWATE is not set
++# CONFIG_CRC32_BIT is not set
++# CONFIG_CRC64 is not set
++# CONFIG_CRC4 is not set
++# CONFIG_CRC7 is not set
++CONFIG_LIBCRC32C=y
++# CONFIG_CRC8 is not set
++CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
++# CONFIG_RANDOM32_SELFTEST is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_LZO_COMPRESS=y
++CONFIG_LZO_DECOMPRESS=y
++CONFIG_XZ_DEC=y
++CONFIG_XZ_DEC_X86=y
++CONFIG_XZ_DEC_POWERPC=y
++CONFIG_XZ_DEC_IA64=y
++CONFIG_XZ_DEC_ARM=y
++CONFIG_XZ_DEC_ARMTHUMB=y
++CONFIG_XZ_DEC_SPARC=y
++CONFIG_XZ_DEC_BCJ=y
++# CONFIG_XZ_DEC_TEST is not set
++CONFIG_GENERIC_ALLOCATOR=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT_MAP=y
++CONFIG_HAS_DMA=y
++CONFIG_NEED_SG_DMA_LENGTH=y
++CONFIG_NEED_DMA_MAP_STATE=y
++CONFIG_ARCH_DMA_ADDR_T_64BIT=y
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_DMA_DIRECT_OPS=y
++CONFIG_SWIOTLB=y
++CONFIG_SGL_ALLOC=y
++CONFIG_CPU_RMAP=y
++CONFIG_DQL=y
++CONFIG_NLATTR=y
++# CONFIG_CORDIC is not set
++# CONFIG_DDR is not set
++# CONFIG_IRQ_POLL is not set
++CONFIG_LIBFDT=y
++CONFIG_SG_POOL=y
++CONFIG_ARCH_HAS_SG_CHAIN=y
++CONFIG_SBITMAP=y
++# CONFIG_STRING_SELFTEST is not set
++
++#
++# Kernel hacking
++#
++
++#
++# printk and dmesg options
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
++CONFIG_CONSOLE_LOGLEVEL_QUIET=4
++CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
++# CONFIG_BOOT_PRINTK_DELAY is not set
++
++#
++# Compile-time checks and compiler options
++#
++# CONFIG_DEBUG_INFO is not set
++CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=2048
++# CONFIG_STRIP_ASM_SYMS is not set
++# CONFIG_READABLE_ASM is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_PAGE_OWNER is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++# CONFIG_DEBUG_SECTION_MISMATCH is not set
++CONFIG_SECTION_MISMATCH_WARN_ONLY=y
++CONFIG_ARCH_WANT_FRAME_POINTERS=y
++CONFIG_FRAME_POINTER=y
++# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
++CONFIG_MAGIC_SYSRQ=y
++CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
++CONFIG_MAGIC_SYSRQ_SERIAL=y
++CONFIG_DEBUG_KERNEL=y
++
++#
++# Memory Debugging
++#
++# CONFIG_PAGE_EXTENSION is not set
++# CONFIG_DEBUG_PAGEALLOC is not set
++# CONFIG_PAGE_POISONING is not set
++# CONFIG_DEBUG_RODATA_TEST is not set
++# CONFIG_DEBUG_OBJECTS is not set
++# CONFIG_SLUB_DEBUG_ON is not set
++# CONFIG_SLUB_STATS is not set
++CONFIG_HAVE_DEBUG_KMEMLEAK=y
++# CONFIG_DEBUG_KMEMLEAK is not set
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_VM is not set
++CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
++# CONFIG_DEBUG_VIRTUAL is not set
++# CONFIG_DEBUG_MEMORY_INIT is not set
++# CONFIG_DEBUG_PER_CPU_MAPS is not set
++CONFIG_HAVE_ARCH_KASAN=y
++# CONFIG_KASAN is not set
++CONFIG_ARCH_HAS_KCOV=y
++CONFIG_CC_HAS_SANCOV_TRACE_PC=y
++# CONFIG_KCOV is not set
++# CONFIG_DEBUG_SHIRQ is not set
++
++#
++# Debug Lockups and Hangs
++#
++# CONFIG_SOFTLOCKUP_DETECTOR is not set
++CONFIG_DETECT_HUNG_TASK=y
++CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
++# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
++# CONFIG_WQ_WATCHDOG is not set
++CONFIG_PANIC_ON_OOPS=y
++CONFIG_PANIC_ON_OOPS_VALUE=1
++CONFIG_PANIC_TIMEOUT=0
++CONFIG_SCHED_DEBUG=y
++CONFIG_SCHED_INFO=y
++CONFIG_SCHEDSTATS=y
++# CONFIG_SCHED_STACK_END_CHECK is not set
++# CONFIG_DEBUG_TIMEKEEPING is not set
++
++#
++# Lock Debugging (spinlocks, mutexes, etc...)
++#
++CONFIG_LOCK_DEBUGGING_SUPPORT=y
++# CONFIG_PROVE_LOCKING is not set
++# CONFIG_LOCK_STAT is not set
++# CONFIG_DEBUG_RT_MUTEXES is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++# CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
++# CONFIG_DEBUG_RWSEMS is not set
++# CONFIG_DEBUG_LOCK_ALLOC is not set
++# CONFIG_DEBUG_ATOMIC_SLEEP is not set
++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++# CONFIG_LOCK_TORTURE_TEST is not set
++# CONFIG_WW_MUTEX_SELFTEST is not set
++CONFIG_STACKTRACE=y
++# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set
++# CONFIG_DEBUG_KOBJECT is not set
++CONFIG_HAVE_DEBUG_BUGVERBOSE=y
++CONFIG_DEBUG_BUGVERBOSE=y
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_PI_LIST is not set
++# CONFIG_DEBUG_SG is not set
++# CONFIG_DEBUG_NOTIFIERS is not set
++# CONFIG_DEBUG_CREDENTIALS is not set
++
++#
++# RCU Debugging
++#
++# CONFIG_RCU_PERF_TEST is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++CONFIG_RCU_CPU_STALL_TIMEOUT=60
++CONFIG_RCU_TRACE=y
++# CONFIG_RCU_EQS_DEBUG is not set
++# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
++# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
++# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
++# CONFIG_NOTIFIER_ERROR_INJECTION is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_LATENCYTOP is not set
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
++CONFIG_HAVE_C_RECORDMCOUNT=y
++CONFIG_TRACE_CLOCK=y
++CONFIG_TRACING_SUPPORT=y
++# CONFIG_FTRACE is not set
++# CONFIG_DMA_API_DEBUG is not set
++CONFIG_RUNTIME_TESTING_MENU=y
++# CONFIG_TEST_LIST_SORT is not set
++# CONFIG_TEST_SORT is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
++# CONFIG_RBTREE_TEST is not set
++# CONFIG_INTERVAL_TREE_TEST is not set
++# CONFIG_PERCPU_TEST is not set
++# CONFIG_ATOMIC64_SELFTEST is not set
++# CONFIG_TEST_HEXDUMP is not set
++# CONFIG_TEST_STRING_HELPERS is not set
++# CONFIG_TEST_KSTRTOX is not set
++# CONFIG_TEST_PRINTF is not set
++# CONFIG_TEST_BITMAP is not set
++# CONFIG_TEST_BITFIELD is not set
++# CONFIG_TEST_UUID is not set
++# CONFIG_TEST_OVERFLOW is not set
++# CONFIG_TEST_RHASHTABLE is not set
++# CONFIG_TEST_HASH is not set
++# CONFIG_TEST_IDA is not set
++# CONFIG_TEST_LKM is not set
++# CONFIG_TEST_USER_COPY is not set
++# CONFIG_TEST_BPF is not set
++# CONFIG_FIND_BIT_BENCHMARK is not set
++# CONFIG_TEST_FIRMWARE is not set
++# CONFIG_TEST_SYSCTL is not set
++# CONFIG_TEST_UDELAY is not set
++# CONFIG_TEST_STATIC_KEYS is not set
++# CONFIG_TEST_KMOD is not set
++# CONFIG_MEMTEST is not set
++# CONFIG_BUG_ON_DATA_CORRUPTION is not set
++# CONFIG_SAMPLES is not set
++CONFIG_HAVE_ARCH_KGDB=y
++# CONFIG_KGDB is not set
++CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
++# CONFIG_UBSAN is not set
++CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
++# CONFIG_STRICT_DEVMEM is not set
++# CONFIG_ARM64_PTDUMP_DEBUGFS is not set
++# CONFIG_PID_IN_CONTEXTIDR is not set
++# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
++# CONFIG_DEBUG_WX is not set
++# CONFIG_DEBUG_ALIGN_RODATA is not set
++# CONFIG_ARM64_RELOC_TEST is not set
++# CONFIG_CORESIGHT is not set
+diff --git a/arch/arm64/configs/ss928v100_emmc_defconfig b/arch/arm64/configs/ss928v100_emmc_defconfig
+new file mode 100644
+index 000000000000..0f7a1e6d102c
+--- /dev/null
++++ b/arch/arm64/configs/ss928v100_emmc_defconfig
+@@ -0,0 +1,4137 @@
++#
++# Automatically generated file; DO NOT EDIT.
++# Linux/arm64 4.19.90 Kernel Configuration
++#
++
++#
++# Compiler: aarch64-mix210-linux-gcc (20220321) 7.3.0
++#
++CONFIG_CC_IS_GCC=y
++CONFIG_GCC_VERSION=70300
++CONFIG_CLANG_VERSION=0
++CONFIG_CC_HAS_ASM_GOTO=y
++CONFIG_IRQ_WORK=y
++CONFIG_BUILDTIME_EXTABLE_SORT=y
++CONFIG_THREAD_INFO_IN_TASK=y
++
++#
++# General setup
++#
++CONFIG_INIT_ENV_ARG_LIMIT=32
++# CONFIG_COMPILE_TEST is not set
++CONFIG_LOCALVERSION=""
++# CONFIG_LOCALVERSION_AUTO is not set
++CONFIG_BUILD_SALT=""
++CONFIG_DEFAULT_HOSTNAME="(none)"
++# CONFIG_SWAP is not set
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++CONFIG_CROSS_MEMORY_ATTACH=y
++CONFIG_USELIB=y
++# CONFIG_AUDIT is not set
++CONFIG_HAVE_ARCH_AUDITSYSCALL=y
++
++#
++# IRQ subsystem
++#
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
++CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
++CONFIG_GENERIC_IRQ_MIGRATION=y
++CONFIG_HARDIRQS_SW_RESEND=y
++CONFIG_IRQ_DOMAIN=y
++CONFIG_IRQ_DOMAIN_HIERARCHY=y
++CONFIG_GENERIC_MSI_IRQ=y
++CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
++CONFIG_HANDLE_DOMAIN_IRQ=y
++CONFIG_IRQ_FORCED_THREADING=y
++CONFIG_SPARSE_IRQ=y
++# CONFIG_GENERIC_IRQ_DEBUGFS is not set
++CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
++CONFIG_ARCH_CLOCKSOURCE_DATA=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_ARCH_HAS_TICK_BROADCAST=y
++CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
++
++#
++# Timers subsystem
++#
++CONFIG_TICK_ONESHOT=y
++CONFIG_HZ_PERIODIC=y
++# CONFIG_NO_HZ_IDLE is not set
++# CONFIG_NO_HZ_FULL is not set
++# CONFIG_NO_HZ is not set
++CONFIG_HIGH_RES_TIMERS=y
++CONFIG_PREEMPT_NONE=y
++# CONFIG_PREEMPT_VOLUNTARY is not set
++# CONFIG_PREEMPT is not set
++
++#
++# CPU/Task time and stats accounting
++#
++CONFIG_TICK_CPU_ACCOUNTING=y
++# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
++# CONFIG_IRQ_TIME_ACCOUNTING is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++CONFIG_CPU_ISOLATION=y
++
++#
++# RCU Subsystem
++#
++CONFIG_TREE_RCU=y
++# CONFIG_RCU_EXPERT is not set
++CONFIG_SRCU=y
++CONFIG_TREE_SRCU=y
++CONFIG_RCU_STALL_COMMON=y
++CONFIG_RCU_NEED_SEGCBLIST=y
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
++CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
++CONFIG_GENERIC_SCHED_CLOCK=y
++CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
++CONFIG_ARCH_SUPPORTS_INT128=y
++CONFIG_CGROUPS=y
++# CONFIG_MEMCG is not set
++# CONFIG_BLK_CGROUP is not set
++# CONFIG_CGROUP_SCHED is not set
++# CONFIG_CGROUP_PIDS is not set
++# CONFIG_CGROUP_RDMA is not set
++# CONFIG_CGROUP_FREEZER is not set
++# CONFIG_CPUSETS is not set
++# CONFIG_CGROUP_DEVICE is not set
++# CONFIG_CGROUP_CPUACCT is not set
++# CONFIG_CGROUP_BPF is not set
++# CONFIG_CGROUP_DEBUG is not set
++CONFIG_NAMESPACES=y
++CONFIG_UTS_NS=y
++CONFIG_IPC_NS=y
++# CONFIG_USER_NS is not set
++CONFIG_PID_NS=y
++CONFIG_NET_NS=y
++# CONFIG_CHECKPOINT_RESTORE is not set
++# CONFIG_SCHED_AUTOGROUP is not set
++# CONFIG_SYSFS_DEPRECATED is not set
++CONFIG_RELAY=y
++# CONFIG_BLK_DEV_INITRD is not set
++CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_ANON_INODES=y
++CONFIG_HAVE_UID16=y
++CONFIG_SYSCTL_EXCEPTION_TRACE=y
++CONFIG_BPF=y
++CONFIG_EXPERT=y
++CONFIG_UID16=y
++CONFIG_MULTIUSER=y
++# CONFIG_SGETMASK_SYSCALL is not set
++CONFIG_SYSFS_SYSCALL=y
++# CONFIG_SYSCTL_SYSCALL is not set
++# CONFIG_FHANDLE is not set
++CONFIG_POSIX_TIMERS=y
++CONFIG_PRINTK=y
++CONFIG_PRINTK_NMI=y
++CONFIG_BUG=y
++CONFIG_ELF_CORE=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_FUTEX_PI=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_AIO=y
++CONFIG_ADVISE_SYSCALLS=y
++CONFIG_MEMBARRIER=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++CONFIG_KALLSYMS_BASE_RELATIVE=y
++CONFIG_BPF_SYSCALL=y
++CONFIG_USERFAULTFD=y
++CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
++CONFIG_RSEQ=y
++# CONFIG_DEBUG_RSEQ is not set
++CONFIG_EMBEDDED=y
++CONFIG_HAVE_PERF_EVENTS=y
++# CONFIG_PC104 is not set
++
++#
++# Kernel Performance Events And Counters
++#
++# CONFIG_PERF_EVENTS is not set
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++# CONFIG_COMPAT_BRK is not set
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++CONFIG_SLAB_MERGE_DEFAULT=y
++# CONFIG_SLAB_FREELIST_RANDOM is not set
++# CONFIG_SLAB_FREELIST_HARDENED is not set
++CONFIG_SLUB_CPU_PARTIAL=y
++CONFIG_SYSTEM_DATA_VERIFICATION=y
++# CONFIG_PROFILING is not set
++CONFIG_ARM64=y
++CONFIG_64BIT=y
++CONFIG_MMU=y
++CONFIG_ARM64_PAGE_SHIFT=12
++CONFIG_ARM64_CONT_SHIFT=4
++CONFIG_ARCH_MMAP_RND_BITS_MIN=18
++CONFIG_ARCH_MMAP_RND_BITS_MAX=24
++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
++CONFIG_LOCKDEP_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_RWSEM_XCHGADD_ALGORITHM=y
++CONFIG_GENERIC_BUG=y
++CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CSUM=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_ZONE_DMA32=y
++CONFIG_HAVE_GENERIC_GUP=y
++CONFIG_SMP=y
++CONFIG_KERNEL_MODE_NEON=y
++CONFIG_FIX_EARLYCON_MEM=y
++CONFIG_PGTABLE_LEVELS=3
++CONFIG_ARCH_SUPPORTS_UPROBES=y
++CONFIG_ARCH_PROC_KCORE_TEXT=y
++
++#
++# Platform selection
++#
++# CONFIG_ARCH_ACTIONS is not set
++# CONFIG_ARCH_SUNXI is not set
++# CONFIG_ARCH_ALPINE is not set
++# CONFIG_ARCH_BCM2835 is not set
++# CONFIG_ARCH_BCM_IPROC is not set
++# CONFIG_ARCH_BERLIN is not set
++# CONFIG_ARCH_BRCMSTB is not set
++# CONFIG_ARCH_EXYNOS is not set
++# CONFIG_ARCH_K3 is not set
++# CONFIG_ARCH_LAYERSCAPE is not set
++# CONFIG_ARCH_LG1K is not set
++# CONFIG_ARCH_HISI is not set
++CONFIG_ARCH_BSP=y
++# CONFIG_ARCH_SS528V100 is not set
++# CONFIG_ARCH_SS625V100 is not set
++# CONFIG_ARCH_SS919V100 is not set
++# CONFIG_ARCH_SS015V100 is not set
++CONFIG_ARCH_SS928V100=y
++# CONFIG_ARCH_SS927V100 is not set
++# CONFIG_ARCH_MEDIATEK is not set
++# CONFIG_ARCH_MESON is not set
++# CONFIG_ARCH_MVEBU is not set
++# CONFIG_ARCH_QCOM is not set
++# CONFIG_ARCH_REALTEK is not set
++# CONFIG_ARCH_ROCKCHIP is not set
++# CONFIG_ARCH_SEATTLE is not set
++# CONFIG_ARCH_SYNQUACER is not set
++# CONFIG_ARCH_RENESAS is not set
++# CONFIG_ARCH_STRATIX10 is not set
++# CONFIG_ARCH_TEGRA is not set
++# CONFIG_ARCH_SPRD is not set
++# CONFIG_ARCH_THUNDER is not set
++# CONFIG_ARCH_THUNDER2 is not set
++# CONFIG_ARCH_UNIPHIER is not set
++# CONFIG_ARCH_VEXPRESS is not set
++# CONFIG_ARCH_XGENE is not set
++# CONFIG_ARCH_ZX is not set
++# CONFIG_ARCH_ZYNQMP is not set
++
++#
++# Bus support
++#
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_DOMAINS_GENERIC=y
++CONFIG_PCI_SYSCALL=y
++CONFIG_PCIEPORTBUS=y
++# CONFIG_PCIEAER is not set
++# CONFIG_PCIEASPM is not set
++CONFIG_PCIE_PME=y
++# CONFIG_PCIE_PTM is not set
++CONFIG_PCI_MSI=y
++CONFIG_PCI_MSI_IRQ_DOMAIN=y
++CONFIG_PCI_QUIRKS=y
++# CONFIG_PCI_DEBUG is not set
++# CONFIG_PCI_STUB is not set
++# CONFIG_PCI_IOV is not set
++# CONFIG_PCI_PRI is not set
++# CONFIG_PCI_PASID is not set
++# CONFIG_HOTPLUG_PCI is not set
++
++#
++# PCI controller drivers
++#
++
++#
++# Cadence PCIe controllers support
++#
++# CONFIG_PCIE_CADENCE_HOST is not set
++# CONFIG_PCI_FTPCI100 is not set
++# CONFIG_PCI_HOST_GENERIC is not set
++# CONFIG_PCIE_XILINX is not set
++# CONFIG_PCI_XGENE is not set
++# CONFIG_PCI_HOST_THUNDER_PEM is not set
++# CONFIG_PCI_HOST_THUNDER_ECAM is not set
++
++#
++# DesignWare PCI Core Support
++#
++# CONFIG_PCIE_DW_PLAT_HOST is not set
++# CONFIG_PCI_HISI is not set
++# CONFIG_PCIE_KIRIN is not set
++
++#
++# PCI Endpoint
++#
++# CONFIG_PCI_ENDPOINT is not set
++
++#
++# PCI switch controller drivers
++#
++# CONFIG_PCI_SW_SWITCHTEC is not set
++# CONFIG_BSP_PCIE is not set
++
++#
++# Kernel Features
++#
++
++#
++# ARM errata workarounds via the alternatives framework
++#
++CONFIG_ARM64_ERRATUM_826319=y
++CONFIG_ARM64_ERRATUM_827319=y
++CONFIG_ARM64_ERRATUM_824069=y
++CONFIG_ARM64_ERRATUM_819472=y
++CONFIG_ARM64_ERRATUM_832075=y
++CONFIG_ARM64_ERRATUM_845719=y
++CONFIG_ARM64_ERRATUM_843419=y
++CONFIG_ARM64_ERRATUM_1024718=y
++CONFIG_ARM64_ERRATUM_1463225=y
++CONFIG_CAVIUM_ERRATUM_22375=y
++CONFIG_CAVIUM_ERRATUM_23154=y
++CONFIG_CAVIUM_ERRATUM_27456=y
++CONFIG_CAVIUM_ERRATUM_30115=y
++CONFIG_QCOM_FALKOR_ERRATUM_1003=y
++CONFIG_QCOM_FALKOR_ERRATUM_1009=y
++CONFIG_QCOM_QDF2400_ERRATUM_0065=y
++CONFIG_SOCIONEXT_SYNQUACER_PREITS=y
++CONFIG_HISILICON_ERRATUM_161600802=y
++CONFIG_QCOM_FALKOR_ERRATUM_E1041=y
++CONFIG_ARM64_4K_PAGES=y
++# CONFIG_ARM64_16K_PAGES is not set
++# CONFIG_ARM64_64K_PAGES is not set
++CONFIG_ARM64_VA_BITS_39=y
++# CONFIG_ARM64_VA_BITS_48 is not set
++CONFIG_ARM64_VA_BITS=39
++CONFIG_ARM64_PA_BITS_48=y
++CONFIG_ARM64_PA_BITS=48
++# CONFIG_CPU_BIG_ENDIAN is not set
++CONFIG_SCHED_MC=y
++# CONFIG_SCHED_SMT is not set
++CONFIG_NR_CPUS=4
++CONFIG_HOTPLUG_CPU=y
++# CONFIG_NUMA is not set
++CONFIG_HOLES_IN_ZONE=y
++CONFIG_HZ_100=y
++# CONFIG_HZ_250 is not set
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=100
++CONFIG_SCHED_HRTICK=y
++CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
++CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y
++CONFIG_ARCH_SPARSEMEM_ENABLE=y
++CONFIG_ARCH_SPARSEMEM_DEFAULT=y
++CONFIG_ARCH_SELECT_MEMORY_MODEL=y
++CONFIG_ARCH_FLATMEM_ENABLE=y
++CONFIG_HAVE_ARCH_PFN_VALID=y
++CONFIG_SYS_SUPPORTS_HUGETLBFS=y
++CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
++CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
++# CONFIG_SECCOMP is not set
++# CONFIG_PARAVIRT is not set
++# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
++# CONFIG_KEXEC is not set
++# CONFIG_CRASH_DUMP is not set
++# CONFIG_XEN is not set
++CONFIG_FORCE_MAX_ZONEORDER=11
++CONFIG_UNMAP_KERNEL_AT_EL0=y
++CONFIG_HARDEN_BRANCH_PREDICTOR=y
++CONFIG_HARDEN_EL2_VECTORS=y
++CONFIG_ARM64_SSBD=y
++# CONFIG_ARMV8_DEPRECATED is not set
++# CONFIG_ARM64_SW_TTBR0_PAN is not set
++
++#
++# ARMv8.1 architectural features
++#
++CONFIG_ARM64_HW_AFDBM=y
++CONFIG_ARM64_PAN=y
++# CONFIG_ARM64_LSE_ATOMICS is not set
++CONFIG_ARM64_VHE=y
++
++#
++# ARMv8.2 architectural features
++#
++CONFIG_ARM64_UAO=y
++# CONFIG_ARM64_PMEM is not set
++CONFIG_ARM64_RAS_EXTN=y
++CONFIG_ARM64_SVE=y
++CONFIG_ARM64_MODULE_PLTS=y
++# CONFIG_RANDOMIZE_BASE is not set
++
++#
++# Boot options
++#
++CONFIG_CMDLINE="mem=128M console=ttyAMA0,115200 console=ttyMTD,blackbox"
++# CONFIG_CMDLINE_FORCE is not set
++# CONFIG_EFI is not set
++CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y
++CONFIG_IMG_GZ_DTB=y
++# CONFIG_IMG_DTB is not set
++CONFIG_BUILD_ARM64_APPENDED_KERNEL_IMAGE_NAME="Image.gz-dtb"
++CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES="vendor/ss928v100-demb-emmc"
++CONFIG_COMPAT=y
++CONFIG_SYSVIPC_COMPAT=y
++
++#
++# Power management options
++#
++CONFIG_SUSPEND=y
++CONFIG_SUSPEND_FREEZER=y
++# CONFIG_SUSPEND_SKIP_SYNC is not set
++CONFIG_PM_SLEEP=y
++CONFIG_PM_SLEEP_SMP=y
++# CONFIG_PM_AUTOSLEEP is not set
++# CONFIG_PM_WAKELOCKS is not set
++CONFIG_PM=y
++# CONFIG_PM_DEBUG is not set
++CONFIG_PM_CLK=y
++# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
++CONFIG_CPU_PM=y
++CONFIG_ARCH_HIBERNATION_POSSIBLE=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++
++#
++# CPU Power Management
++#
++
++#
++# CPU Idle
++#
++# CONFIG_CPU_IDLE is not set
++
++#
++# CPU Frequency scaling
++#
++CONFIG_CPU_FREQ=y
++CONFIG_CPU_FREQ_GOV_ATTR_SET=y
++CONFIG_CPU_FREQ_GOV_COMMON=y
++CONFIG_CPU_FREQ_STAT=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
++CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
++CONFIG_CPU_FREQ_GOV_POWERSAVE=y
++CONFIG_CPU_FREQ_GOV_USERSPACE=y
++CONFIG_CPU_FREQ_GOV_ONDEMAND=y
++CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
++# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set
++
++#
++# CPU frequency scaling drivers
++#
++CONFIG_CPUFREQ_DT=y
++CONFIG_CPUFREQ_DT_PLATDEV=y
++# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set
++# CONFIG_QORIQ_CPUFREQ is not set
++
++#
++# Firmware Drivers
++#
++CONFIG_ARM_PSCI_FW=y
++# CONFIG_ARM_SDE_INTERFACE is not set
++# CONFIG_FIRMWARE_MEMMAP is not set
++# CONFIG_FW_CFG_SYSFS is not set
++CONFIG_HAVE_ARM_SMCCC=y
++# CONFIG_GOOGLE_FIRMWARE is not set
++
++#
++# Tegra firmware driver
++#
++# CONFIG_VIRTUALIZATION is not set
++# CONFIG_ARM64_CRYPTO is not set
++
++#
++# General architecture-dependent options
++#
++# CONFIG_KPROBES is not set
++# CONFIG_JUMP_LABEL is not set
++CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_HAVE_NMI=y
++CONFIG_HAVE_ARCH_TRACEHOOK=y
++CONFIG_HAVE_DMA_CONTIGUOUS=y
++CONFIG_GENERIC_SMP_IDLE_THREAD=y
++CONFIG_GENERIC_IDLE_POLL_SETUP=y
++CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
++CONFIG_ARCH_HAS_SET_MEMORY=y
++CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
++CONFIG_HAVE_RSEQ=y
++CONFIG_HAVE_CLK=y
++CONFIG_HAVE_PERF_REGS=y
++CONFIG_HAVE_PERF_USER_STACK_DUMP=y
++CONFIG_HAVE_ARCH_JUMP_LABEL=y
++CONFIG_HAVE_RCU_TABLE_FREE=y
++CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
++CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
++CONFIG_HAVE_CMPXCHG_LOCAL=y
++CONFIG_HAVE_CMPXCHG_DOUBLE=y
++CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
++CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
++CONFIG_HAVE_STACKPROTECTOR=y
++CONFIG_CC_HAS_STACKPROTECTOR_NONE=y
++CONFIG_STACKPROTECTOR=y
++CONFIG_STACKPROTECTOR_STRONG=y
++CONFIG_HAVE_CONTEXT_TRACKING=y
++CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
++CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
++CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
++CONFIG_HAVE_ARCH_HUGE_VMAP=y
++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
++CONFIG_MODULES_USE_ELF_RELA=y
++CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
++CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
++CONFIG_ARCH_MMAP_RND_BITS=18
++CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y
++CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11
++CONFIG_CLONE_BACKWARDS=y
++CONFIG_OLD_SIGSUSPEND3=y
++CONFIG_COMPAT_OLD_SIGACTION=y
++CONFIG_COMPAT_32BIT_TIME=y
++CONFIG_HAVE_ARCH_VMAP_STACK=y
++CONFIG_VMAP_STACK=y
++CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
++CONFIG_STRICT_KERNEL_RWX=y
++CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
++CONFIG_STRICT_MODULE_RWX=y
++CONFIG_REFCOUNT_FULL=y
++CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y
++
++#
++# GCOV-based kernel profiling
++#
++# CONFIG_GCOV_KERNEL is not set
++CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
++CONFIG_PLUGIN_HOSTCC=""
++CONFIG_HAVE_GCC_PLUGINS=y
++CONFIG_RT_MUTEXES=y
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_FORCE_LOAD=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++# CONFIG_MODULE_SIG is not set
++# CONFIG_MODULE_COMPRESS is not set
++# CONFIG_TRIM_UNUSED_KSYMS is not set
++CONFIG_BLOCK=y
++CONFIG_BLK_SCSI_REQUEST=y
++CONFIG_BLK_DEV_BSG=y
++# CONFIG_BLK_DEV_BSGLIB is not set
++# CONFIG_BLK_DEV_INTEGRITY is not set
++# CONFIG_BLK_DEV_ZONED is not set
++CONFIG_BLK_CMDLINE_PARSER=y
++# CONFIG_BLK_WBT is not set
++CONFIG_BLK_DEBUG_FS=y
++# CONFIG_BLK_SED_OPAL is not set
++
++#
++# Partition Types
++#
++CONFIG_PARTITION_ADVANCED=y
++# CONFIG_ACORN_PARTITION is not set
++# CONFIG_AIX_PARTITION is not set
++# CONFIG_OSF_PARTITION is not set
++# CONFIG_AMIGA_PARTITION is not set
++# CONFIG_ATARI_PARTITION is not set
++# CONFIG_MAC_PARTITION is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_BSD_DISKLABEL is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# CONFIG_UNIXWARE_DISKLABEL is not set
++# CONFIG_LDM_PARTITION is not set
++# CONFIG_SGI_PARTITION is not set
++# CONFIG_ULTRIX_PARTITION is not set
++# CONFIG_SUN_PARTITION is not set
++# CONFIG_KARMA_PARTITION is not set
++CONFIG_EFI_PARTITION=y
++# CONFIG_SYSV68_PARTITION is not set
++CONFIG_CMDLINE_PARTITION=y
++CONFIG_BLOCK_COMPAT=y
++CONFIG_BLK_MQ_PCI=y
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_DEADLINE=y
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="deadline"
++CONFIG_MQ_IOSCHED_DEADLINE=y
++CONFIG_MQ_IOSCHED_KYBER=y
++# CONFIG_IOSCHED_BFQ is not set
++CONFIG_ASN1=y
++CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y
++CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_LOCK=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_INLINE_READ_LOCK=y
++CONFIG_ARCH_INLINE_READ_LOCK_BH=y
++CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_READ_UNLOCK=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_INLINE_WRITE_LOCK=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_SPIN_TRYLOCK=y
++CONFIG_INLINE_SPIN_TRYLOCK_BH=y
++CONFIG_INLINE_SPIN_LOCK=y
++CONFIG_INLINE_SPIN_LOCK_BH=y
++CONFIG_INLINE_SPIN_LOCK_IRQ=y
++CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y
++CONFIG_INLINE_SPIN_UNLOCK_BH=y
++CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
++CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_READ_LOCK=y
++CONFIG_INLINE_READ_LOCK_BH=y
++CONFIG_INLINE_READ_LOCK_IRQ=y
++CONFIG_INLINE_READ_LOCK_IRQSAVE=y
++CONFIG_INLINE_READ_UNLOCK=y
++CONFIG_INLINE_READ_UNLOCK_BH=y
++CONFIG_INLINE_READ_UNLOCK_IRQ=y
++CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_WRITE_LOCK=y
++CONFIG_INLINE_WRITE_LOCK_BH=y
++CONFIG_INLINE_WRITE_LOCK_IRQ=y
++CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y
++CONFIG_INLINE_WRITE_UNLOCK=y
++CONFIG_INLINE_WRITE_UNLOCK_BH=y
++CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
++CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
++CONFIG_MUTEX_SPIN_ON_OWNER=y
++CONFIG_RWSEM_SPIN_ON_OWNER=y
++CONFIG_LOCK_SPIN_ON_OWNER=y
++CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
++CONFIG_QUEUED_SPINLOCKS=y
++CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
++CONFIG_QUEUED_RWLOCKS=y
++CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y
++CONFIG_FREEZER=y
++
++#
++# Executable file formats
++#
++CONFIG_BINFMT_ELF=y
++CONFIG_COMPAT_BINFMT_ELF=y
++CONFIG_ELFCORE=y
++CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
++CONFIG_BINFMT_SCRIPT=y
++# CONFIG_BINFMT_MISC is not set
++CONFIG_COREDUMP=y
++
++#
++# Memory Management options
++#
++CONFIG_SELECT_MEMORY_MODEL=y
++# CONFIG_FLATMEM_MANUAL is not set
++CONFIG_SPARSEMEM_MANUAL=y
++CONFIG_SPARSEMEM=y
++CONFIG_HAVE_MEMORY_PRESENT=y
++CONFIG_SPARSEMEM_EXTREME=y
++CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
++CONFIG_SPARSEMEM_VMEMMAP=y
++CONFIG_HAVE_MEMBLOCK=y
++CONFIG_NO_BOOTMEM=y
++CONFIG_MEMORY_ISOLATION=y
++CONFIG_SPLIT_PTLOCK_CPUS=4
++CONFIG_COMPACTION=y
++CONFIG_MIGRATION=y
++CONFIG_PHYS_ADDR_T_64BIT=y
++CONFIG_MMU_NOTIFIER=y
++CONFIG_KSM=y
++CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
++CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
++# CONFIG_MEMORY_FAILURE is not set
++# CONFIG_TRANSPARENT_HUGEPAGE is not set
++# CONFIG_CLEANCACHE is not set
++CONFIG_CMA=y
++# CONFIG_CMA_DEBUG is not set
++# CONFIG_CMA_DEBUGFS is not set
++CONFIG_CMA_AREAS=7
++# CONFIG_ZPOOL is not set
++# CONFIG_ZBUD is not set
++# CONFIG_ZSMALLOC is not set
++CONFIG_GENERIC_EARLY_IOREMAP=y
++# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
++# CONFIG_IDLE_PAGE_TRACKING is not set
++CONFIG_FRAME_VECTOR=y
++# CONFIG_PERCPU_STATS is not set
++# CONFIG_GUP_BENCHMARK is not set
++CONFIG_ARCH_HAS_PTE_SPECIAL=y
++CONFIG_NET=y
++CONFIG_COMPAT_NETLINK_MESSAGES=y
++CONFIG_NET_INGRESS=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_DIAG is not set
++CONFIG_UNIX=y
++# CONFIG_UNIX_DIAG is not set
++# CONFIG_TLS is not set
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# CONFIG_XFRM_INTERFACE is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
++# CONFIG_NET_KEY is not set
++# CONFIG_XDP_SOCKETS is not set
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=y
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++# CONFIG_IP_PNP_BOOTP is not set
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE_DEMUX is not set
++CONFIG_NET_IP_TUNNEL=m
++# CONFIG_IP_MROUTE is not set
++# CONFIG_SYN_COOKIES is not set
++# CONFIG_NET_IPVTI is not set
++# CONFIG_NET_FOU is not set
++# CONFIG_NET_FOU_IP_TUNNELS is not set
++# CONFIG_INET_AH is not set
++# CONFIG_INET_ESP is not set
++# CONFIG_INET_IPCOMP is not set
++CONFIG_INET_TUNNEL=m
++CONFIG_INET_XFRM_MODE_TRANSPORT=y
++CONFIG_INET_XFRM_MODE_TUNNEL=y
++CONFIG_INET_XFRM_MODE_BEET=y
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_INET_UDP_DIAG is not set
++# CONFIG_INET_RAW_DIAG is not set
++# CONFIG_INET_DIAG_DESTROY is not set
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++CONFIG_IPV6=y
++CONFIG_IPV6_ROUTER_PREF=y
++# CONFIG_IPV6_ROUTE_INFO is not set
++# CONFIG_IPV6_OPTIMISTIC_DAD is not set
++# CONFIG_INET6_AH is not set
++# CONFIG_INET6_ESP is not set
++# CONFIG_INET6_IPCOMP is not set
++# CONFIG_IPV6_MIP6 is not set
++# CONFIG_IPV6_ILA is not set
++CONFIG_INET6_XFRM_MODE_TRANSPORT=m
++CONFIG_INET6_XFRM_MODE_TUNNEL=m
++CONFIG_INET6_XFRM_MODE_BEET=m
++# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
++# CONFIG_IPV6_VTI is not set
++CONFIG_IPV6_SIT=m
++# CONFIG_IPV6_SIT_6RD is not set
++CONFIG_IPV6_NDISC_NODETYPE=y
++# CONFIG_IPV6_TUNNEL is not set
++# CONFIG_IPV6_MULTIPLE_TABLES is not set
++# CONFIG_IPV6_MROUTE is not set
++# CONFIG_IPV6_SEG6_LWTUNNEL is not set
++# CONFIG_IPV6_SEG6_HMAC is not set
++# CONFIG_NETWORK_SECMARK is not set
++# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
++CONFIG_NETFILTER=y
++CONFIG_NETFILTER_ADVANCED=y
++
++#
++# Core Netfilter Configuration
++#
++CONFIG_NETFILTER_INGRESS=y
++# CONFIG_NETFILTER_NETLINK_ACCT is not set
++# CONFIG_NETFILTER_NETLINK_QUEUE is not set
++# CONFIG_NETFILTER_NETLINK_LOG is not set
++# CONFIG_NETFILTER_NETLINK_OSF is not set
++# CONFIG_NF_CONNTRACK is not set
++# CONFIG_NF_LOG_NETDEV is not set
++# CONFIG_NF_TABLES is not set
++# CONFIG_NETFILTER_XTABLES is not set
++# CONFIG_IP_SET is not set
++# CONFIG_IP_VS is not set
++
++#
++# IP: Netfilter Configuration
++#
++# CONFIG_NF_SOCKET_IPV4 is not set
++# CONFIG_NF_TPROXY_IPV4 is not set
++# CONFIG_NF_DUP_IPV4 is not set
++# CONFIG_NF_LOG_ARP is not set
++# CONFIG_NF_LOG_IPV4 is not set
++# CONFIG_NF_REJECT_IPV4 is not set
++# CONFIG_IP_NF_IPTABLES is not set
++# CONFIG_IP_NF_ARPTABLES is not set
++
++#
++# IPv6: Netfilter Configuration
++#
++# CONFIG_NF_SOCKET_IPV6 is not set
++# CONFIG_NF_TPROXY_IPV6 is not set
++# CONFIG_NF_DUP_IPV6 is not set
++# CONFIG_NF_REJECT_IPV6 is not set
++# CONFIG_NF_LOG_IPV6 is not set
++# CONFIG_IP6_NF_IPTABLES is not set
++# CONFIG_BPFILTER is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_RDS is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_L2TP is not set
++# CONFIG_BRIDGE is not set
++CONFIG_HAVE_NET_DSA=y
++# CONFIG_NET_DSA is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_PHONET is not set
++# CONFIG_6LOWPAN is not set
++# CONFIG_IEEE802154 is not set
++# CONFIG_NET_SCHED is not set
++# CONFIG_DCB is not set
++# CONFIG_DNS_RESOLVER is not set
++# CONFIG_BATMAN_ADV is not set
++# CONFIG_OPENVSWITCH is not set
++# CONFIG_VSOCKETS is not set
++# CONFIG_NETLINK_DIAG is not set
++# CONFIG_MPLS is not set
++# CONFIG_NET_NSH is not set
++# CONFIG_HSR is not set
++# CONFIG_NET_SWITCHDEV is not set
++# CONFIG_NET_L3_MASTER_DEV is not set
++# CONFIG_NET_NCSI is not set
++CONFIG_RPS=y
++CONFIG_RFS_ACCEL=y
++CONFIG_XPS=y
++# CONFIG_CGROUP_NET_PRIO is not set
++# CONFIG_CGROUP_NET_CLASSID is not set
++CONFIG_NET_RX_BUSY_POLL=y
++CONFIG_BQL=y
++# CONFIG_BPF_JIT is not set
++# CONFIG_BPF_STREAM_PARSER is not set
++CONFIG_NET_FLOW_LIMIT=y
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
++# CONFIG_BT is not set
++# CONFIG_AF_RXRPC is not set
++# CONFIG_AF_KCM is not set
++CONFIG_WIRELESS=y
++CONFIG_WIRELESS_EXT=y
++CONFIG_WEXT_CORE=y
++CONFIG_WEXT_PROC=y
++CONFIG_WEXT_SPY=y
++CONFIG_WEXT_PRIV=y
++CONFIG_CFG80211=y
++# CONFIG_NL80211_TESTMODE is not set
++# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
++# CONFIG_CFG80211_CERTIFICATION_ONUS is not set
++CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y
++CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y
++# CONFIG_CFG80211_DEFAULT_PS is not set
++CONFIG_CFG80211_DEBUGFS=y
++# CONFIG_CFG80211_CRDA_SUPPORT is not set
++CONFIG_CFG80211_WEXT=y
++# CONFIG_MAC80211 is not set
++CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
++# CONFIG_WIMAX is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++# CONFIG_CAIF is not set
++# CONFIG_CEPH_LIB is not set
++# CONFIG_NFC is not set
++# CONFIG_PSAMPLE is not set
++# CONFIG_NET_IFE is not set
++# CONFIG_LWTUNNEL is not set
++CONFIG_DST_CACHE=y
++CONFIG_GRO_CELLS=y
++# CONFIG_NET_DEVLINK is not set
++CONFIG_MAY_USE_DEVLINK=y
++# CONFIG_FAILOVER is not set
++CONFIG_HAVE_EBPF_JIT=y
++
++#
++# Device Drivers
++#
++CONFIG_ARM_AMBA=y
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER=y
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_DEVTMPFS=y
++CONFIG_DEVTMPFS_MOUNT=y
++CONFIG_STANDALONE=y
++# CONFIG_PREVENT_FIRMWARE_BUILD is not set
++
++#
++# Firmware loader
++#
++CONFIG_FW_LOADER=y
++CONFIG_EXTRA_FIRMWARE=""
++# CONFIG_FW_LOADER_USER_HELPER is not set
++CONFIG_ALLOW_DEV_COREDUMP=y
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
++# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
++CONFIG_GENERIC_CPU_AUTOPROBE=y
++CONFIG_GENERIC_CPU_VULNERABILITIES=y
++CONFIG_REGMAP=y
++CONFIG_REGMAP_I2C=y
++CONFIG_REGMAP_SPI=y
++CONFIG_REGMAP_MMIO=y
++CONFIG_DMA_SHARED_BUFFER=y
++# CONFIG_DMA_FENCE_TRACE is not set
++CONFIG_DMA_CMA=y
++
++#
++# Default contiguous memory area size:
++#
++CONFIG_CMA_SIZE_MBYTES=4
++CONFIG_CMA_SIZE_SEL_MBYTES=y
++# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
++# CONFIG_CMA_SIZE_SEL_MIN is not set
++# CONFIG_CMA_SIZE_SEL_MAX is not set
++CONFIG_CMA_ALIGNMENT=8
++CONFIG_GENERIC_ARCH_TOPOLOGY=y
++
++#
++# Bus devices
++#
++# CONFIG_BRCMSTB_GISB_ARB is not set
++# CONFIG_SIMPLE_PM_BUS is not set
++# CONFIG_VEXPRESS_CONFIG is not set
++# CONFIG_CONNECTOR is not set
++# CONFIG_GNSS is not set
++# CONFIG_MTD is not set
++CONFIG_DTC=y
++CONFIG_OF=y
++# CONFIG_OF_UNITTEST is not set
++CONFIG_OF_FLATTREE=y
++CONFIG_OF_EARLY_FLATTREE=y
++CONFIG_OF_KOBJ=y
++CONFIG_OF_ADDRESS=y
++CONFIG_OF_IRQ=y
++CONFIG_OF_NET=y
++CONFIG_OF_MDIO=y
++CONFIG_OF_RESERVED_MEM=y
++# CONFIG_OF_OVERLAY is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_NULL_BLK is not set
++# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
++# CONFIG_BLK_DEV_DAC960 is not set
++# CONFIG_BLK_DEV_UMEM is not set
++CONFIG_BLK_DEV_LOOP=y
++CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_DRBD is not set
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_SKD is not set
++# CONFIG_BLK_DEV_SX8 is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=65536
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++# CONFIG_BLK_DEV_RBD is not set
++# CONFIG_BLK_DEV_RSXX is not set
++
++#
++# NVME Support
++#
++# CONFIG_BLK_DEV_NVME is not set
++# CONFIG_NVME_FC is not set
++# CONFIG_NVME_TARGET is not set
++
++#
++# Misc devices
++#
++# CONFIG_AD525X_DPOT is not set
++# CONFIG_DUMMY_IRQ is not set
++# CONFIG_PHANTOM is not set
++# CONFIG_SGI_IOC4 is not set
++# CONFIG_TIFM_CORE is not set
++# CONFIG_ICS932S401 is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_HP_ILO is not set
++# CONFIG_APDS9802ALS is not set
++# CONFIG_ISL29003 is not set
++# CONFIG_ISL29020 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_SENSORS_BH1770 is not set
++# CONFIG_SENSORS_APDS990X is not set
++# CONFIG_HMC6352 is not set
++# CONFIG_DS1682 is not set
++# CONFIG_USB_SWITCH_FSA9480 is not set
++# CONFIG_LATTICE_ECP3_CONFIG is not set
++# CONFIG_SRAM is not set
++# CONFIG_PCI_ENDPOINT_TEST is not set
++# CONFIG_C2PORT is not set
++
++#
++# EEPROM support
++#
++# CONFIG_EEPROM_AT24 is not set
++# CONFIG_EEPROM_AT25 is not set
++# CONFIG_EEPROM_LEGACY is not set
++# CONFIG_EEPROM_MAX6875 is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_EEPROM_93XX46 is not set
++# CONFIG_EEPROM_IDT_89HPESX is not set
++# CONFIG_CB710_CORE is not set
++
++#
++# Texas Instruments shared transport line discipline
++#
++# CONFIG_TI_ST is not set
++# CONFIG_SENSORS_LIS3_SPI is not set
++# CONFIG_SENSORS_LIS3_I2C is not set
++# CONFIG_ALTERA_STAPL is not set
++
++#
++# Intel MIC & related support
++#
++
++#
++# Intel MIC Bus Driver
++#
++
++#
++# SCIF Bus Driver
++#
++
++#
++# VOP Bus Driver
++#
++
++#
++# Intel MIC Host Driver
++#
++
++#
++# Intel MIC Card Driver
++#
++
++#
++# SCIF Driver
++#
++
++#
++# Intel MIC Coprocessor State Management (COSM) Drivers
++#
++
++#
++# VOP Driver
++#
++# CONFIG_GENWQE is not set
++# CONFIG_ECHO is not set
++# CONFIG_MISC_RTSX_PCI is not set
++# CONFIG_MISC_RTSX_USB is not set
++
++#
++# SCSI device support
++#
++CONFIG_SCSI_MOD=y
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_DMA=y
++# CONFIG_SCSI_MQ_DEFAULT is not set
++CONFIG_SCSI_PROC_FS=y
++
++#
++# SCSI support type (disk, tape, CD-ROM)
++#
++CONFIG_BLK_DEV_SD=y
++# CONFIG_CHR_DEV_ST is not set
++# CONFIG_CHR_DEV_OSST is not set
++# CONFIG_BLK_DEV_SR is not set
++# CONFIG_CHR_DEV_SG is not set
++# CONFIG_CHR_DEV_SCH is not set
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++# CONFIG_SCSI_SCAN_ASYNC is not set
++
++#
++# SCSI Transports
++#
++# CONFIG_SCSI_SPI_ATTRS is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++# CONFIG_SCSI_SRP_ATTRS is not set
++CONFIG_SCSI_LOWLEVEL=y
++# CONFIG_ISCSI_TCP is not set
++# CONFIG_ISCSI_BOOT_SYSFS is not set
++# CONFIG_SCSI_CXGB3_ISCSI is not set
++# CONFIG_SCSI_CXGB4_ISCSI is not set
++# CONFIG_SCSI_BNX2_ISCSI is not set
++# CONFIG_BE2ISCSI is not set
++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
++# CONFIG_SCSI_HPSA is not set
++# CONFIG_SCSI_3W_9XXX is not set
++# CONFIG_SCSI_3W_SAS is not set
++# CONFIG_SCSI_ACARD is not set
++# CONFIG_SCSI_AACRAID is not set
++# CONFIG_SCSI_AIC7XXX is not set
++# CONFIG_SCSI_AIC79XX is not set
++# CONFIG_SCSI_AIC94XX is not set
++# CONFIG_SCSI_MVSAS is not set
++# CONFIG_SCSI_MVUMI is not set
++# CONFIG_SCSI_ADVANSYS is not set
++# CONFIG_SCSI_ARCMSR is not set
++# CONFIG_SCSI_ESAS2R is not set
++# CONFIG_MEGARAID_NEWGEN is not set
++# CONFIG_MEGARAID_LEGACY is not set
++# CONFIG_MEGARAID_SAS is not set
++# CONFIG_SCSI_MPT3SAS is not set
++# CONFIG_SCSI_MPT2SAS is not set
++# CONFIG_SCSI_SMARTPQI is not set
++# CONFIG_SCSI_UFSHCD is not set
++# CONFIG_SCSI_HPTIOP is not set
++# CONFIG_SCSI_SNIC is not set
++# CONFIG_SCSI_DMX3191D is not set
++# CONFIG_SCSI_IPS is not set
++# CONFIG_SCSI_INITIO is not set
++# CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_STEX is not set
++# CONFIG_SCSI_SYM53C8XX_2 is not set
++# CONFIG_SCSI_QLOGIC_1280 is not set
++# CONFIG_SCSI_QLA_ISCSI is not set
++# CONFIG_SCSI_DC395x is not set
++# CONFIG_SCSI_AM53C974 is not set
++# CONFIG_SCSI_WD719X is not set
++# CONFIG_SCSI_DEBUG is not set
++# CONFIG_SCSI_PMCRAID is not set
++# CONFIG_SCSI_PM8001 is not set
++# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
++# CONFIG_SCSI_DH is not set
++# CONFIG_SCSI_OSD_INITIATOR is not set
++CONFIG_HAVE_PATA_PLATFORM=y
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_TARGET_CORE is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_FIREWIRE_NOSY is not set
++CONFIG_NETDEVICES=y
++CONFIG_MII=y
++CONFIG_NET_CORE=y
++# CONFIG_BONDING is not set
++# CONFIG_DUMMY is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_NET_FC is not set
++# CONFIG_NET_TEAM is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_IPVLAN is not set
++# CONFIG_VXLAN is not set
++# CONFIG_GENEVE is not set
++# CONFIG_GTP is not set
++# CONFIG_MACSEC is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_TUN is not set
++# CONFIG_TUN_VNET_CROSS_LE is not set
++# CONFIG_VETH is not set
++# CONFIG_NLMON is not set
++# CONFIG_ARCNET is not set
++
++#
++# CAIF transport drivers
++#
++
++#
++# Distributed Switch Architecture drivers
++#
++CONFIG_ETHERNET=y
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_VENDOR_ADAPTEC is not set
++# CONFIG_NET_VENDOR_AGERE is not set
++# CONFIG_NET_VENDOR_ALACRITECH is not set
++# CONFIG_NET_VENDOR_ALTEON is not set
++# CONFIG_ALTERA_TSE is not set
++# CONFIG_NET_VENDOR_AMAZON is not set
++# CONFIG_NET_VENDOR_AMD is not set
++# CONFIG_NET_VENDOR_AQUANTIA is not set
++# CONFIG_NET_VENDOR_ARC is not set
++# CONFIG_NET_VENDOR_ATHEROS is not set
++# CONFIG_NET_VENDOR_AURORA is not set
++# CONFIG_NET_VENDOR_BROADCOM is not set
++# CONFIG_NET_VENDOR_BROCADE is not set
++# CONFIG_NET_VENDOR_CADENCE is not set
++# CONFIG_NET_VENDOR_CAVIUM is not set
++# CONFIG_NET_VENDOR_CHELSIO is not set
++# CONFIG_NET_VENDOR_CISCO is not set
++# CONFIG_NET_VENDOR_CORTINA is not set
++# CONFIG_DNET is not set
++# CONFIG_NET_VENDOR_DEC is not set
++# CONFIG_NET_VENDOR_DLINK is not set
++# CONFIG_NET_VENDOR_EMULEX is not set
++# CONFIG_NET_VENDOR_EZCHIP is not set
++# CONFIG_NET_VENDOR_HISILICON is not set
++# CONFIG_NET_VENDOR_HP is not set
++# CONFIG_NET_VENDOR_HUAWEI is not set
++# CONFIG_NET_VENDOR_INTEL is not set
++CONFIG_NET_VENDOR_BSP=y
++# CONFIG_BSP_FEMAC is not set
++CONFIG_ETH_GMAC=y
++CONFIG_GMAC_DDR_64BIT=y
++CONFIG_GMAC_DESC_4WORD=y
++CONFIG_GMAC_RXCSUM=y
++CONFIG_RX_FLOW_CTRL_SUPPORT=y
++CONFIG_TX_FLOW_CTRL_SUPPORT=y
++CONFIG_TX_FLOW_CTRL_PAUSE_TIME=0xFFFF
++CONFIG_TX_FLOW_CTRL_PAUSE_INTERVAL=0xFFFF
++CONFIG_TX_FLOW_CTRL_ACTIVE_THRESHOLD=16
++CONFIG_TX_FLOW_CTRL_DEACTIVE_THRESHOLD=32
++# CONFIG_JME is not set
++# CONFIG_NET_VENDOR_MARVELL is not set
++# CONFIG_NET_VENDOR_MELLANOX is not set
++# CONFIG_NET_VENDOR_MICREL is not set
++# CONFIG_NET_VENDOR_MICROCHIP is not set
++# CONFIG_NET_VENDOR_MICROSEMI is not set
++# CONFIG_NET_VENDOR_MYRI is not set
++# CONFIG_FEALNX is not set
++# CONFIG_NET_VENDOR_NATSEMI is not set
++# CONFIG_NET_VENDOR_NETERION is not set
++# CONFIG_NET_VENDOR_NETRONOME is not set
++# CONFIG_NET_VENDOR_NI is not set
++# CONFIG_NET_VENDOR_NVIDIA is not set
++# CONFIG_NET_VENDOR_OKI is not set
++# CONFIG_ETHOC is not set
++# CONFIG_NET_VENDOR_PACKET_ENGINES is not set
++# CONFIG_NET_VENDOR_QLOGIC is not set
++# CONFIG_NET_VENDOR_QUALCOMM is not set
++# CONFIG_NET_VENDOR_RDC is not set
++# CONFIG_NET_VENDOR_REALTEK is not set
++# CONFIG_NET_VENDOR_RENESAS is not set
++# CONFIG_NET_VENDOR_ROCKER is not set
++# CONFIG_NET_VENDOR_SAMSUNG is not set
++# CONFIG_NET_VENDOR_SEEQ is not set
++# CONFIG_NET_VENDOR_SOLARFLARE is not set
++# CONFIG_NET_VENDOR_SILAN is not set
++# CONFIG_NET_VENDOR_SIS is not set
++# CONFIG_NET_VENDOR_SMSC is not set
++# CONFIG_NET_VENDOR_SOCIONEXT is not set
++# CONFIG_NET_VENDOR_STMICRO is not set
++# CONFIG_NET_VENDOR_SUN is not set
++# CONFIG_NET_VENDOR_SYNOPSYS is not set
++# CONFIG_NET_VENDOR_TEHUTI is not set
++# CONFIG_NET_VENDOR_TI is not set
++# CONFIG_NET_VENDOR_VIA is not set
++# CONFIG_NET_VENDOR_WIZNET is not set
++# CONFIG_FDDI is not set
++# CONFIG_HIPPI is not set
++CONFIG_MDIO_DEVICE=y
++CONFIG_MDIO_BUS=y
++# CONFIG_MDIO_BCM_UNIMAC is not set
++# CONFIG_MDIO_BITBANG is not set
++# CONFIG_MDIO_BUS_MUX_GPIO is not set
++# CONFIG_MDIO_BUS_MUX_MMIOREG is not set
++# CONFIG_MDIO_HISI_FEMAC is not set
++# CONFIG_MDIO_BSP_FEMAC is not set
++CONFIG_MDIO_BSP_GEMAC=y
++# CONFIG_MDIO_MSCC_MIIM is not set
++# CONFIG_MDIO_OCTEON is not set
++# CONFIG_MDIO_THUNDER is not set
++CONFIG_PHYLIB=y
++CONFIG_SWPHY=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_AMD_PHY is not set
++# CONFIG_AQUANTIA_PHY is not set
++# CONFIG_AX88796B_PHY is not set
++# CONFIG_AT803X_PHY is not set
++# CONFIG_BCM7XXX_PHY is not set
++# CONFIG_BCM87XX_PHY is not set
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_CORTINA_PHY is not set
++# CONFIG_DAVICOM_PHY is not set
++# CONFIG_DP83822_PHY is not set
++# CONFIG_DP83TC811_PHY is not set
++# CONFIG_DP83848_PHY is not set
++# CONFIG_DP83867_PHY is not set
++CONFIG_FIXED_PHY=y
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_INTEL_XWAY_PHY is not set
++# CONFIG_LSI_ET1011C_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_MARVELL_PHY is not set
++# CONFIG_MARVELL_10G_PHY is not set
++# CONFIG_MICREL_PHY is not set
++# CONFIG_MICROCHIP_PHY is not set
++# CONFIG_MICROCHIP_T1_PHY is not set
++# CONFIG_MICROSEMI_PHY is not set
++# CONFIG_NATIONAL_PHY is not set
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_REALTEK_PHY is not set
++# CONFIG_RENESAS_PHY is not set
++# CONFIG_ROCKCHIP_PHY is not set
++# CONFIG_SMSC_PHY is not set
++# CONFIG_STE10XP is not set
++# CONFIG_TERANETICS_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++# CONFIG_XILINX_GMII2RGMII is not set
++# CONFIG_MICREL_KS8995MA is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++CONFIG_USB_NET_DRIVERS=y
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_RTL8152 is not set
++# CONFIG_USB_LAN78XX is not set
++CONFIG_USB_USBNET=y
++CONFIG_USB_NET_AX8817X=y
++CONFIG_USB_NET_AX88179_178A=y
++CONFIG_USB_NET_CDCETHER=y
++# CONFIG_USB_NET_CDC_EEM is not set
++CONFIG_USB_NET_CDC_NCM=y
++# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set
++# CONFIG_USB_NET_CDC_MBIM is not set
++# CONFIG_USB_NET_DM9601 is not set
++# CONFIG_USB_NET_SR9700 is not set
++# CONFIG_USB_NET_SR9800 is not set
++# CONFIG_USB_NET_SMSC75XX is not set
++# CONFIG_USB_NET_SMSC95XX is not set
++# CONFIG_USB_NET_GL620A is not set
++CONFIG_USB_NET_NET1080=y
++# CONFIG_USB_NET_PLUSB is not set
++# CONFIG_USB_NET_MCS7830 is not set
++# CONFIG_USB_NET_RNDIS_HOST is not set
++CONFIG_USB_NET_CDC_SUBSET_ENABLE=y
++CONFIG_USB_NET_CDC_SUBSET=y
++# CONFIG_USB_ALI_M5632 is not set
++# CONFIG_USB_AN2720 is not set
++CONFIG_USB_BELKIN=y
++CONFIG_USB_ARMLINUX=y
++# CONFIG_USB_EPSON2888 is not set
++# CONFIG_USB_KC2190 is not set
++CONFIG_USB_NET_ZAURUS=y
++# CONFIG_USB_NET_CX82310_ETH is not set
++# CONFIG_USB_NET_KALMIA is not set
++CONFIG_USB_NET_QMI_WWAN=y
++# CONFIG_USB_NET_INT51X1 is not set
++# CONFIG_USB_IPHETH is not set
++# CONFIG_USB_SIERRA_NET is not set
++# CONFIG_USB_VL600 is not set
++# CONFIG_USB_NET_CH9200 is not set
++CONFIG_USB_NET_EC20_GOBINET=y
++CONFIG_WLAN=y
++# CONFIG_WIRELESS_WDS is not set
++# CONFIG_WLAN_VENDOR_ADMTEK is not set
++# CONFIG_WLAN_VENDOR_ATH is not set
++# CONFIG_WLAN_VENDOR_ATMEL is not set
++# CONFIG_WLAN_VENDOR_BROADCOM is not set
++# CONFIG_WLAN_VENDOR_CISCO is not set
++# CONFIG_WLAN_VENDOR_INTEL is not set
++# CONFIG_WLAN_VENDOR_INTERSIL is not set
++# CONFIG_WLAN_VENDOR_MARVELL is not set
++# CONFIG_WLAN_VENDOR_MEDIATEK is not set
++# CONFIG_WLAN_VENDOR_RALINK is not set
++# CONFIG_WLAN_VENDOR_REALTEK is not set
++# CONFIG_WLAN_VENDOR_RSI is not set
++# CONFIG_WLAN_VENDOR_ST is not set
++# CONFIG_WLAN_VENDOR_TI is not set
++# CONFIG_WLAN_VENDOR_ZYDAS is not set
++# CONFIG_WLAN_VENDOR_QUANTENNA is not set
++CONFIG_HI1102A=y
++CONFIG_HI110X_SDIO_FPGA=y
++CONFIG_HI110X_SDIO_NON_STD_CARD_SUPPORT=y
++CONFIG_HI110X_SDIO_DETECT_FUNCTION=y
++CONFIG_HI1102_WIFI=y
++# CONFIG_USB_NET_RNDIS_WLAN is not set
++
++#
++# Enable WiMAX (Networking options) to see the WiMAX drivers
++#
++# CONFIG_WAN is not set
++# CONFIG_VMXNET3 is not set
++# CONFIG_NETDEVSIM is not set
++# CONFIG_NET_FAILOVER is not set
++# CONFIG_ISDN is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++CONFIG_INPUT_FF_MEMLESS=y
++# CONFIG_INPUT_POLLDEV is not set
++# CONFIG_INPUT_SPARSEKMAP is not set
++# CONFIG_INPUT_MATRIXKMAP is not set
++
++#
++# Userland interfaces
++#
++CONFIG_INPUT_MOUSEDEV=y
++CONFIG_INPUT_MOUSEDEV_PSAUX=y
++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
++CONFIG_INPUT_JOYDEV=y
++CONFIG_INPUT_EVDEV=y
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++CONFIG_INPUT_KEYBOARD=y
++# CONFIG_KEYBOARD_ADC is not set
++# CONFIG_KEYBOARD_ADP5588 is not set
++# CONFIG_KEYBOARD_ADP5589 is not set
++CONFIG_KEYBOARD_ATKBD=y
++# CONFIG_KEYBOARD_QT1070 is not set
++# CONFIG_KEYBOARD_QT2160 is not set
++# CONFIG_KEYBOARD_DLINK_DIR685 is not set
++# CONFIG_KEYBOARD_LKKBD is not set
++# CONFIG_KEYBOARD_GPIO is not set
++# CONFIG_KEYBOARD_GPIO_POLLED is not set
++# CONFIG_KEYBOARD_TCA6416 is not set
++# CONFIG_KEYBOARD_TCA8418 is not set
++# CONFIG_KEYBOARD_MATRIX is not set
++# CONFIG_KEYBOARD_LM8333 is not set
++# CONFIG_KEYBOARD_MAX7359 is not set
++# CONFIG_KEYBOARD_MCS is not set
++# CONFIG_KEYBOARD_MPR121 is not set
++# CONFIG_KEYBOARD_NEWTON is not set
++# CONFIG_KEYBOARD_OPENCORES is not set
++# CONFIG_KEYBOARD_SAMSUNG is not set
++# CONFIG_KEYBOARD_STOWAWAY is not set
++# CONFIG_KEYBOARD_SUNKBD is not set
++# CONFIG_KEYBOARD_OMAP4 is not set
++# CONFIG_KEYBOARD_XTKBD is not set
++# CONFIG_KEYBOARD_CAP11XX is not set
++# CONFIG_KEYBOARD_BCM is not set
++CONFIG_INPUT_MOUSE=y
++CONFIG_MOUSE_PS2=y
++CONFIG_MOUSE_PS2_ALPS=y
++CONFIG_MOUSE_PS2_BYD=y
++CONFIG_MOUSE_PS2_LOGIPS2PP=y
++CONFIG_MOUSE_PS2_SYNAPTICS=y
++CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y
++CONFIG_MOUSE_PS2_CYPRESS=y
++CONFIG_MOUSE_PS2_TRACKPOINT=y
++# CONFIG_MOUSE_PS2_ELANTECH is not set
++# CONFIG_MOUSE_PS2_SENTELIC is not set
++# CONFIG_MOUSE_PS2_TOUCHKIT is not set
++CONFIG_MOUSE_PS2_FOCALTECH=y
++CONFIG_MOUSE_PS2_SMBUS=y
++# CONFIG_MOUSE_SERIAL is not set
++# CONFIG_MOUSE_APPLETOUCH is not set
++# CONFIG_MOUSE_BCM5974 is not set
++# CONFIG_MOUSE_CYAPA is not set
++# CONFIG_MOUSE_ELAN_I2C is not set
++# CONFIG_MOUSE_VSXXXAA is not set
++# CONFIG_MOUSE_GPIO is not set
++# CONFIG_MOUSE_SYNAPTICS_I2C is not set
++# CONFIG_MOUSE_SYNAPTICS_USB is not set
++CONFIG_INPUT_JOYSTICK=y
++# CONFIG_JOYSTICK_ANALOG is not set
++# CONFIG_JOYSTICK_A3D is not set
++# CONFIG_JOYSTICK_ADI is not set
++# CONFIG_JOYSTICK_COBRA is not set
++# CONFIG_JOYSTICK_GF2K is not set
++# CONFIG_JOYSTICK_GRIP is not set
++# CONFIG_JOYSTICK_GRIP_MP is not set
++# CONFIG_JOYSTICK_GUILLEMOT is not set
++# CONFIG_JOYSTICK_INTERACT is not set
++# CONFIG_JOYSTICK_SIDEWINDER is not set
++# CONFIG_JOYSTICK_TMDC is not set
++# CONFIG_JOYSTICK_IFORCE is not set
++# CONFIG_JOYSTICK_WARRIOR is not set
++# CONFIG_JOYSTICK_MAGELLAN is not set
++# CONFIG_JOYSTICK_SPACEORB is not set
++# CONFIG_JOYSTICK_SPACEBALL is not set
++# CONFIG_JOYSTICK_STINGER is not set
++# CONFIG_JOYSTICK_TWIDJOY is not set
++# CONFIG_JOYSTICK_ZHENHUA is not set
++# CONFIG_JOYSTICK_AS5011 is not set
++# CONFIG_JOYSTICK_JOYDUMP is not set
++# CONFIG_JOYSTICK_XPAD is not set
++# CONFIG_JOYSTICK_PSXPAD_SPI is not set
++# CONFIG_JOYSTICK_PXRC is not set
++# CONFIG_INPUT_TABLET is not set
++CONFIG_INPUT_TOUCHSCREEN=y
++CONFIG_TOUCHSCREEN_PROPERTIES=y
++# CONFIG_TOUCHSCREEN_ADS7846 is not set
++# CONFIG_TOUCHSCREEN_AD7877 is not set
++# CONFIG_TOUCHSCREEN_AD7879 is not set
++# CONFIG_TOUCHSCREEN_ADC is not set
++# CONFIG_TOUCHSCREEN_AR1021_I2C is not set
++# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
++# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
++# CONFIG_TOUCHSCREEN_BU21013 is not set
++# CONFIG_TOUCHSCREEN_BU21029 is not set
++# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set
++# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
++# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
++# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set
++# CONFIG_TOUCHSCREEN_DYNAPRO is not set
++# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
++# CONFIG_TOUCHSCREEN_EETI is not set
++# CONFIG_TOUCHSCREEN_EGALAX is not set
++# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set
++# CONFIG_TOUCHSCREEN_EXC3000 is not set
++# CONFIG_TOUCHSCREEN_FUJITSU is not set
++CONFIG_TOUCHSCREEN_GOODIX=y
++# CONFIG_TOUCHSCREEN_HIDEEP is not set
++# CONFIG_TOUCHSCREEN_ILI210X is not set
++# CONFIG_TOUCHSCREEN_S6SY761 is not set
++# CONFIG_TOUCHSCREEN_GUNZE is not set
++# CONFIG_TOUCHSCREEN_EKTF2127 is not set
++# CONFIG_TOUCHSCREEN_ELAN is not set
++# CONFIG_TOUCHSCREEN_ELO is not set
++# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
++# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
++# CONFIG_TOUCHSCREEN_MAX11801 is not set
++# CONFIG_TOUCHSCREEN_MCS5000 is not set
++# CONFIG_TOUCHSCREEN_MMS114 is not set
++# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
++# CONFIG_TOUCHSCREEN_MTOUCH is not set
++# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set
++# CONFIG_TOUCHSCREEN_INEXIO is not set
++# CONFIG_TOUCHSCREEN_MK712 is not set
++# CONFIG_TOUCHSCREEN_PENMOUNT is not set
++# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set
++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
++# CONFIG_TOUCHSCREEN_PIXCIR is not set
++# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set
++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
++# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
++# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
++# CONFIG_TOUCHSCREEN_TSC2004 is not set
++# CONFIG_TOUCHSCREEN_TSC2005 is not set
++# CONFIG_TOUCHSCREEN_TSC2007 is not set
++# CONFIG_TOUCHSCREEN_RM_TS is not set
++# CONFIG_TOUCHSCREEN_SILEAD is not set
++# CONFIG_TOUCHSCREEN_SIS_I2C is not set
++# CONFIG_TOUCHSCREEN_ST1232 is not set
++# CONFIG_TOUCHSCREEN_SUR40 is not set
++# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set
++# CONFIG_TOUCHSCREEN_SX8654 is not set
++# CONFIG_TOUCHSCREEN_TPS6507X is not set
++# CONFIG_TOUCHSCREEN_ZET6223 is not set
++# CONFIG_TOUCHSCREEN_ZFORCE is not set
++# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set
++CONFIG_INPUT_MISC=y
++# CONFIG_INPUT_AD714X is not set
++# CONFIG_INPUT_ATMEL_CAPTOUCH is not set
++# CONFIG_INPUT_BMA150 is not set
++# CONFIG_INPUT_E3X0_BUTTON is not set
++# CONFIG_INPUT_MMA8450 is not set
++# CONFIG_INPUT_GP2A is not set
++# CONFIG_INPUT_GPIO_BEEPER is not set
++# CONFIG_INPUT_GPIO_DECODER is not set
++# CONFIG_INPUT_ATI_REMOTE2 is not set
++# CONFIG_INPUT_KEYSPAN_REMOTE is not set
++# CONFIG_INPUT_KXTJ9 is not set
++# CONFIG_INPUT_POWERMATE is not set
++# CONFIG_INPUT_YEALINK is not set
++# CONFIG_INPUT_CM109 is not set
++# CONFIG_INPUT_REGULATOR_HAPTIC is not set
++CONFIG_INPUT_UINPUT=y
++# CONFIG_INPUT_PCF8574 is not set
++# CONFIG_INPUT_PWM_BEEPER is not set
++# CONFIG_INPUT_PWM_VIBRA is not set
++# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
++# CONFIG_INPUT_ADXL34X is not set
++# CONFIG_INPUT_CMA3000 is not set
++# CONFIG_INPUT_DRV260X_HAPTICS is not set
++# CONFIG_INPUT_DRV2665_HAPTICS is not set
++# CONFIG_INPUT_DRV2667_HAPTICS is not set
++# CONFIG_RMI4_CORE is not set
++
++#
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_SERPORT=y
++# CONFIG_SERIO_AMBAKMI is not set
++# CONFIG_SERIO_PCIPS2 is not set
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_SERIO_ALTERA_PS2 is not set
++# CONFIG_SERIO_PS2MULT is not set
++# CONFIG_SERIO_ARC_PS2 is not set
++# CONFIG_SERIO_APBPS2 is not set
++# CONFIG_SERIO_GPIO_PS2 is not set
++# CONFIG_USERIO is not set
++CONFIG_GAMEPORT=y
++# CONFIG_GAMEPORT_NS558 is not set
++# CONFIG_GAMEPORT_L4 is not set
++# CONFIG_GAMEPORT_EMU10K1 is not set
++# CONFIG_GAMEPORT_FM801 is not set
++
++#
++# Character devices
++#
++CONFIG_TTY=y
++CONFIG_VT=y
++CONFIG_CONSOLE_TRANSLATIONS=y
++CONFIG_VT_CONSOLE=y
++CONFIG_VT_CONSOLE_SLEEP=y
++CONFIG_HW_CONSOLE=y
++# CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_UNIX98_PTYS=y
++# CONFIG_LEGACY_PTYS is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_NOZOMI is not set
++# CONFIG_N_GSM is not set
++# CONFIG_TRACE_SINK is not set
++CONFIG_LDISC_AUTOLOAD=y
++CONFIG_DEVMEM=y
++
++#
++# Serial drivers
++#
++CONFIG_SERIAL_EARLYCON=y
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++# CONFIG_SERIAL_AMBA_PL010 is not set
++CONFIG_SERIAL_AMBA_PL011=y
++CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
++# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set
++# CONFIG_SERIAL_MAX3100 is not set
++# CONFIG_SERIAL_MAX310X is not set
++# CONFIG_SERIAL_UARTLITE is not set
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++# CONFIG_SERIAL_JSM is not set
++# CONFIG_SERIAL_SCCNXP is not set
++# CONFIG_SERIAL_SC16IS7XX is not set
++# CONFIG_SERIAL_ALTERA_JTAGUART is not set
++# CONFIG_SERIAL_ALTERA_UART is not set
++# CONFIG_SERIAL_IFX6X60 is not set
++# CONFIG_SERIAL_XILINX_PS_UART is not set
++# CONFIG_SERIAL_ARC is not set
++# CONFIG_SERIAL_RP2 is not set
++# CONFIG_SERIAL_FSL_LPUART is not set
++# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set
++# CONFIG_SERIAL_DEV_BUS is not set
++# CONFIG_TTY_PRINTK is not set
++# CONFIG_HVC_DCC is not set
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_APPLICOM is not set
++
++#
++# PCMCIA character devices
++#
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++CONFIG_DEVPORT=y
++# CONFIG_XILLYBUS is not set
++
++#
++# I2C support
++#
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++# CONFIG_I2C_COMPAT is not set
++CONFIG_I2C_CHARDEV=y
++CONFIG_I2C_MUX=y
++
++#
++# Multiplexer I2C Chip support
++#
++# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set
++# CONFIG_I2C_MUX_GPIO is not set
++# CONFIG_I2C_MUX_GPMUX is not set
++# CONFIG_I2C_MUX_LTC4306 is not set
++# CONFIG_I2C_MUX_PCA9541 is not set
++# CONFIG_I2C_MUX_PCA954x is not set
++# CONFIG_I2C_MUX_PINCTRL is not set
++# CONFIG_I2C_MUX_REG is not set
++# CONFIG_I2C_DEMUX_PINCTRL is not set
++# CONFIG_I2C_MUX_MLXCPLD is not set
++# CONFIG_I2C_HELPER_AUTO is not set
++# CONFIG_I2C_SMBUS is not set
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++
++#
++# I2C Hardware Bus support
++#
++
++#
++# PC SMBus host controller drivers
++#
++# CONFIG_I2C_ALI1535 is not set
++# CONFIG_I2C_ALI1563 is not set
++# CONFIG_I2C_ALI15X3 is not set
++# CONFIG_I2C_AMD756 is not set
++# CONFIG_I2C_AMD8111 is not set
++# CONFIG_I2C_I801 is not set
++# CONFIG_I2C_ISCH is not set
++# CONFIG_I2C_PIIX4 is not set
++# CONFIG_I2C_NFORCE2 is not set
++# CONFIG_I2C_SIS5595 is not set
++# CONFIG_I2C_SIS630 is not set
++# CONFIG_I2C_SIS96X is not set
++# CONFIG_I2C_VIA is not set
++# CONFIG_I2C_VIAPRO is not set
++
++#
++# I2C system bus drivers (mostly embedded / system-on-chip)
++#
++# CONFIG_I2C_CADENCE is not set
++# CONFIG_I2C_CBUS_GPIO is not set
++# CONFIG_I2C_DESIGNWARE_PLATFORM is not set
++# CONFIG_I2C_DESIGNWARE_PCI is not set
++# CONFIG_I2C_EMEV2 is not set
++# CONFIG_I2C_GPIO is not set
++CONFIG_I2C_BSP=y
++# CONFIG_I2C_NOMADIK is not set
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
++# CONFIG_I2C_RK3X is not set
++# CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_THUNDERX is not set
++# CONFIG_I2C_XILINX is not set
++
++#
++# External I2C/SMBus adapter drivers
++#
++# CONFIG_I2C_DIOLAN_U2C is not set
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_ROBOTFUZZ_OSIF is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_TINY_USB is not set
++
++#
++# Other I2C/SMBus bus drivers
++#
++CONFIG_DMA_MSG_MIN_LEN=5
++CONFIG_DMA_MSG_MAX_LEN=4090
++# CONFIG_I2C_STUB is not set
++# CONFIG_I2C_SLAVE is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++CONFIG_SPI=y
++# CONFIG_SPI_DEBUG is not set
++CONFIG_SPI_MASTER=y
++# CONFIG_SPI_MEM is not set
++
++#
++# SPI Master Controller Drivers
++#
++# CONFIG_SPI_ALTERA is not set
++# CONFIG_SPI_AXI_SPI_ENGINE is not set
++# CONFIG_SPI_BITBANG is not set
++# CONFIG_SPI_CADENCE is not set
++# CONFIG_SPI_DESIGNWARE is not set
++# CONFIG_SPI_GPIO is not set
++# CONFIG_SPI_FSL_SPI is not set
++# CONFIG_SPI_OC_TINY is not set
++CONFIG_SPI_PL022=y
++# CONFIG_SPI_PXA2XX is not set
++# CONFIG_SPI_ROCKCHIP is not set
++# CONFIG_SPI_SC18IS602 is not set
++# CONFIG_SPI_THUNDERX is not set
++# CONFIG_SPI_XCOMM is not set
++# CONFIG_SPI_XILINX is not set
++# CONFIG_SPI_ZYNQMP_GQSPI is not set
++
++#
++# SPI Protocol Masters
++#
++CONFIG_SPI_SPIDEV=y
++# CONFIG_SPI_LOOPBACK_TEST is not set
++# CONFIG_SPI_TLE62X0 is not set
++# CONFIG_SPI_SLAVE is not set
++# CONFIG_SPMI is not set
++# CONFIG_HSI is not set
++# CONFIG_PPS is not set
++
++#
++# PTP clock support
++#
++# CONFIG_PTP_1588_CLOCK is not set
++
++#
++# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
++#
++CONFIG_PINCTRL=y
++CONFIG_GENERIC_PINCTRL_GROUPS=y
++CONFIG_PINMUX=y
++CONFIG_GENERIC_PINMUX_FUNCTIONS=y
++CONFIG_PINCONF=y
++CONFIG_GENERIC_PINCONF=y
++# CONFIG_DEBUG_PINCTRL is not set
++# CONFIG_PINCTRL_AMD is not set
++# CONFIG_PINCTRL_MCP23S08 is not set
++CONFIG_PINCTRL_SINGLE=y
++# CONFIG_PINCTRL_SX150X is not set
++CONFIG_GPIOLIB=y
++CONFIG_GPIOLIB_FASTPATH_LIMIT=512
++CONFIG_OF_GPIO=y
++CONFIG_GPIOLIB_IRQCHIP=y
++CONFIG_DEBUG_GPIO=y
++CONFIG_GPIO_SYSFS=y
++CONFIG_GPIO_GENERIC=y
++
++#
++# Memory mapped GPIO drivers
++#
++# CONFIG_GPIO_74XX_MMIO is not set
++# CONFIG_GPIO_ALTERA is not set
++# CONFIG_GPIO_DWAPB is not set
++# CONFIG_GPIO_FTGPIO010 is not set
++CONFIG_GPIO_GENERIC_PLATFORM=y
++# CONFIG_GPIO_GRGPIO is not set
++# CONFIG_GPIO_HLWD is not set
++# CONFIG_GPIO_MB86S7X is not set
++# CONFIG_GPIO_MOCKUP is not set
++CONFIG_GPIO_PL061=y
++# CONFIG_GPIO_SYSCON is not set
++# CONFIG_GPIO_XGENE is not set
++# CONFIG_GPIO_XILINX is not set
++
++#
++# I2C GPIO expanders
++#
++# CONFIG_GPIO_ADP5588 is not set
++# CONFIG_GPIO_ADNP is not set
++# CONFIG_GPIO_MAX7300 is not set
++# CONFIG_GPIO_MAX732X is not set
++# CONFIG_GPIO_PCA953X is not set
++# CONFIG_GPIO_PCF857X is not set
++# CONFIG_GPIO_TPIC2810 is not set
++
++#
++# MFD GPIO expanders
++#
++
++#
++# PCI GPIO expanders
++#
++# CONFIG_GPIO_BT8XX is not set
++# CONFIG_GPIO_PCI_IDIO_16 is not set
++# CONFIG_GPIO_PCIE_IDIO_24 is not set
++# CONFIG_GPIO_RDC321X is not set
++
++#
++# SPI GPIO expanders
++#
++# CONFIG_GPIO_74X164 is not set
++# CONFIG_GPIO_MAX3191X is not set
++# CONFIG_GPIO_MAX7301 is not set
++# CONFIG_GPIO_MC33880 is not set
++# CONFIG_GPIO_PISOSR is not set
++# CONFIG_GPIO_XRA1403 is not set
++
++#
++# USB GPIO expanders
++#
++# CONFIG_W1 is not set
++# CONFIG_POWER_AVS is not set
++CONFIG_POWER_RESET=y
++# CONFIG_POWER_RESET_BRCMSTB is not set
++# CONFIG_POWER_RESET_GPIO is not set
++# CONFIG_POWER_RESET_GPIO_RESTART is not set
++# CONFIG_POWER_RESET_BSP is not set
++# CONFIG_POWER_RESET_LTC2952 is not set
++# CONFIG_POWER_RESET_RESTART is not set
++# CONFIG_POWER_RESET_XGENE is not set
++# CONFIG_POWER_RESET_SYSCON is not set
++# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set
++# CONFIG_SYSCON_REBOOT_MODE is not set
++CONFIG_POWER_SUPPLY=y
++# CONFIG_POWER_SUPPLY_DEBUG is not set
++# CONFIG_PDA_POWER is not set
++# CONFIG_GENERIC_ADC_BATTERY is not set
++# CONFIG_TEST_POWER is not set
++# CONFIG_CHARGER_ADP5061 is not set
++# CONFIG_BATTERY_DS2780 is not set
++# CONFIG_BATTERY_DS2781 is not set
++# CONFIG_BATTERY_DS2782 is not set
++# CONFIG_BATTERY_LEGO_EV3 is not set
++# CONFIG_BATTERY_SBS is not set
++# CONFIG_CHARGER_SBS is not set
++# CONFIG_MANAGER_SBS is not set
++# CONFIG_BATTERY_BQ27XXX is not set
++# CONFIG_BATTERY_MAX17040 is not set
++# CONFIG_BATTERY_MAX17042 is not set
++# CONFIG_CHARGER_MAX8903 is not set
++# CONFIG_CHARGER_LP8727 is not set
++# CONFIG_CHARGER_GPIO is not set
++# CONFIG_CHARGER_MANAGER is not set
++# CONFIG_CHARGER_LTC3651 is not set
++# CONFIG_CHARGER_DETECTOR_MAX14656 is not set
++# CONFIG_CHARGER_BQ2415X is not set
++# CONFIG_CHARGER_BQ24257 is not set
++# CONFIG_CHARGER_BQ24735 is not set
++# CONFIG_CHARGER_BQ25890 is not set
++# CONFIG_CHARGER_SMB347 is not set
++# CONFIG_BATTERY_GAUGE_LTC2941 is not set
++# CONFIG_CHARGER_RT9455 is not set
++# CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
++# CONFIG_WATCHDOG is not set
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
++CONFIG_BCMA_POSSIBLE=y
++# CONFIG_BCMA is not set
++
++#
++# Multifunction device drivers
++#
++CONFIG_MFD_CORE=y
++# CONFIG_MFD_ACT8945A is not set
++# CONFIG_MFD_AS3711 is not set
++# CONFIG_MFD_AS3722 is not set
++# CONFIG_PMIC_ADP5520 is not set
++# CONFIG_MFD_AAT2870_CORE is not set
++# CONFIG_MFD_ATMEL_FLEXCOM is not set
++# CONFIG_MFD_ATMEL_HLCDC is not set
++# CONFIG_MFD_BCM590XX is not set
++# CONFIG_MFD_BD9571MWV is not set
++# CONFIG_MFD_AXP20X_I2C is not set
++# CONFIG_MFD_CROS_EC is not set
++# CONFIG_MFD_MADERA is not set
++# CONFIG_PMIC_DA903X is not set
++# CONFIG_MFD_DA9052_SPI is not set
++# CONFIG_MFD_DA9052_I2C is not set
++# CONFIG_MFD_DA9055 is not set
++# CONFIG_MFD_DA9062 is not set
++# CONFIG_MFD_DA9063 is not set
++# CONFIG_MFD_DA9150 is not set
++# CONFIG_MFD_DLN2 is not set
++# CONFIG_MFD_MC13XXX_SPI is not set
++# CONFIG_MFD_MC13XXX_I2C is not set
++# CONFIG_MFD_HI6421_PMIC is not set
++CONFIG_MFD_BSP_FMC=y
++# CONFIG_HTC_PASIC3 is not set
++# CONFIG_HTC_I2CPLD is not set
++# CONFIG_LPC_ICH is not set
++# CONFIG_LPC_SCH is not set
++# CONFIG_MFD_JANZ_CMODIO is not set
++# CONFIG_MFD_KEMPLD is not set
++# CONFIG_MFD_88PM800 is not set
++# CONFIG_MFD_88PM805 is not set
++# CONFIG_MFD_88PM860X is not set
++# CONFIG_MFD_MAX14577 is not set
++# CONFIG_MFD_MAX77620 is not set
++# CONFIG_MFD_MAX77686 is not set
++# CONFIG_MFD_MAX77693 is not set
++# CONFIG_MFD_MAX77843 is not set
++# CONFIG_MFD_MAX8907 is not set
++# CONFIG_MFD_MAX8925 is not set
++# CONFIG_MFD_MAX8997 is not set
++# CONFIG_MFD_MAX8998 is not set
++# CONFIG_MFD_MT6397 is not set
++# CONFIG_MFD_MENF21BMC is not set
++# CONFIG_EZX_PCAP is not set
++# CONFIG_MFD_CPCAP is not set
++# CONFIG_MFD_VIPERBOARD is not set
++# CONFIG_MFD_RETU is not set
++# CONFIG_MFD_PCF50633 is not set
++# CONFIG_MFD_RDC321X is not set
++# CONFIG_MFD_RT5033 is not set
++# CONFIG_MFD_RC5T583 is not set
++# CONFIG_MFD_RK808 is not set
++# CONFIG_MFD_RN5T618 is not set
++# CONFIG_MFD_SEC_CORE is not set
++# CONFIG_MFD_SI476X_CORE is not set
++# CONFIG_MFD_SM501 is not set
++# CONFIG_MFD_SKY81452 is not set
++# CONFIG_MFD_SMSC is not set
++# CONFIG_ABX500_CORE is not set
++# CONFIG_MFD_STMPE is not set
++CONFIG_MFD_SYSCON=y
++# CONFIG_MFD_TI_AM335X_TSCADC is not set
++# CONFIG_MFD_LP3943 is not set
++# CONFIG_MFD_LP8788 is not set
++# CONFIG_MFD_TI_LMU is not set
++# CONFIG_MFD_PALMAS is not set
++# CONFIG_TPS6105X is not set
++# CONFIG_TPS65010 is not set
++# CONFIG_TPS6507X is not set
++# CONFIG_MFD_TPS65086 is not set
++# CONFIG_MFD_TPS65090 is not set
++# CONFIG_MFD_TPS65217 is not set
++# CONFIG_MFD_TI_LP873X is not set
++# CONFIG_MFD_TI_LP87565 is not set
++# CONFIG_MFD_TPS65218 is not set
++# CONFIG_MFD_TPS6586X is not set
++# CONFIG_MFD_TPS65910 is not set
++# CONFIG_MFD_TPS65912_I2C is not set
++# CONFIG_MFD_TPS65912_SPI is not set
++# CONFIG_MFD_TPS80031 is not set
++# CONFIG_TWL4030_CORE is not set
++# CONFIG_TWL6040_CORE is not set
++# CONFIG_MFD_WL1273_CORE is not set
++# CONFIG_MFD_LM3533 is not set
++# CONFIG_MFD_TC3589X is not set
++# CONFIG_MFD_VX855 is not set
++# CONFIG_MFD_ARIZONA_I2C is not set
++# CONFIG_MFD_ARIZONA_SPI is not set
++# CONFIG_MFD_WM8400 is not set
++# CONFIG_MFD_WM831X_I2C is not set
++# CONFIG_MFD_WM831X_SPI is not set
++# CONFIG_MFD_WM8350_I2C is not set
++# CONFIG_MFD_WM8994 is not set
++# CONFIG_MFD_ROHM_BD718XX is not set
++CONFIG_REGULATOR=y
++# CONFIG_REGULATOR_DEBUG is not set
++# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
++# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
++# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
++# CONFIG_REGULATOR_88PG86X is not set
++# CONFIG_REGULATOR_ACT8865 is not set
++# CONFIG_REGULATOR_AD5398 is not set
++# CONFIG_REGULATOR_ANATOP is not set
++# CONFIG_REGULATOR_DA9210 is not set
++# CONFIG_REGULATOR_DA9211 is not set
++# CONFIG_REGULATOR_FAN53555 is not set
++# CONFIG_REGULATOR_GPIO is not set
++# CONFIG_REGULATOR_ISL9305 is not set
++# CONFIG_REGULATOR_ISL6271A is not set
++# CONFIG_REGULATOR_LP3971 is not set
++# CONFIG_REGULATOR_LP3972 is not set
++# CONFIG_REGULATOR_LP872X is not set
++# CONFIG_REGULATOR_LP8755 is not set
++# CONFIG_REGULATOR_LTC3589 is not set
++# CONFIG_REGULATOR_LTC3676 is not set
++# CONFIG_REGULATOR_MAX1586 is not set
++# CONFIG_REGULATOR_MAX8649 is not set
++# CONFIG_REGULATOR_MAX8660 is not set
++# CONFIG_REGULATOR_MAX8952 is not set
++# CONFIG_REGULATOR_MT6311 is not set
++# CONFIG_REGULATOR_PFUZE100 is not set
++# CONFIG_REGULATOR_PV88060 is not set
++# CONFIG_REGULATOR_PV88080 is not set
++# CONFIG_REGULATOR_PV88090 is not set
++# CONFIG_REGULATOR_PWM is not set
++# CONFIG_REGULATOR_SY8106A is not set
++# CONFIG_REGULATOR_TPS51632 is not set
++# CONFIG_REGULATOR_TPS62360 is not set
++# CONFIG_REGULATOR_TPS65023 is not set
++# CONFIG_REGULATOR_TPS6507X is not set
++# CONFIG_REGULATOR_TPS65132 is not set
++# CONFIG_REGULATOR_TPS6524X is not set
++# CONFIG_REGULATOR_VCTRL is not set
++# CONFIG_RC_CORE is not set
++CONFIG_MEDIA_SUPPORT=y
++
++#
++# Multimedia core support
++#
++CONFIG_MEDIA_CAMERA_SUPPORT=y
++# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set
++# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set
++# CONFIG_MEDIA_RADIO_SUPPORT is not set
++# CONFIG_MEDIA_SDR_SUPPORT is not set
++# CONFIG_MEDIA_CEC_SUPPORT is not set
++# CONFIG_MEDIA_CONTROLLER is not set
++CONFIG_VIDEO_DEV=y
++CONFIG_VIDEO_V4L2=y
++# CONFIG_VIDEO_ADV_DEBUG is not set
++# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
++
++#
++# Media drivers
++#
++CONFIG_MEDIA_USB_SUPPORT=y
++
++#
++# Webcam devices
++#
++CONFIG_USB_VIDEO_CLASS=y
++CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
++CONFIG_USB_GSPCA=m
++# CONFIG_USB_M5602 is not set
++# CONFIG_USB_STV06XX is not set
++# CONFIG_USB_GL860 is not set
++# CONFIG_USB_GSPCA_BENQ is not set
++# CONFIG_USB_GSPCA_CONEX is not set
++# CONFIG_USB_GSPCA_CPIA1 is not set
++# CONFIG_USB_GSPCA_DTCS033 is not set
++# CONFIG_USB_GSPCA_ETOMS is not set
++# CONFIG_USB_GSPCA_FINEPIX is not set
++# CONFIG_USB_GSPCA_JEILINJ is not set
++# CONFIG_USB_GSPCA_JL2005BCD is not set
++# CONFIG_USB_GSPCA_KINECT is not set
++# CONFIG_USB_GSPCA_KONICA is not set
++# CONFIG_USB_GSPCA_MARS is not set
++# CONFIG_USB_GSPCA_MR97310A is not set
++# CONFIG_USB_GSPCA_NW80X is not set
++# CONFIG_USB_GSPCA_OV519 is not set
++# CONFIG_USB_GSPCA_OV534 is not set
++# CONFIG_USB_GSPCA_OV534_9 is not set
++# CONFIG_USB_GSPCA_PAC207 is not set
++# CONFIG_USB_GSPCA_PAC7302 is not set
++# CONFIG_USB_GSPCA_PAC7311 is not set
++# CONFIG_USB_GSPCA_SE401 is not set
++# CONFIG_USB_GSPCA_SN9C2028 is not set
++# CONFIG_USB_GSPCA_SN9C20X is not set
++# CONFIG_USB_GSPCA_SONIXB is not set
++# CONFIG_USB_GSPCA_SONIXJ is not set
++# CONFIG_USB_GSPCA_SPCA500 is not set
++# CONFIG_USB_GSPCA_SPCA501 is not set
++# CONFIG_USB_GSPCA_SPCA505 is not set
++# CONFIG_USB_GSPCA_SPCA506 is not set
++# CONFIG_USB_GSPCA_SPCA508 is not set
++# CONFIG_USB_GSPCA_SPCA561 is not set
++# CONFIG_USB_GSPCA_SPCA1528 is not set
++# CONFIG_USB_GSPCA_SQ905 is not set
++# CONFIG_USB_GSPCA_SQ905C is not set
++# CONFIG_USB_GSPCA_SQ930X is not set
++# CONFIG_USB_GSPCA_STK014 is not set
++# CONFIG_USB_GSPCA_STK1135 is not set
++# CONFIG_USB_GSPCA_STV0680 is not set
++# CONFIG_USB_GSPCA_SUNPLUS is not set
++# CONFIG_USB_GSPCA_T613 is not set
++# CONFIG_USB_GSPCA_TOPRO is not set
++# CONFIG_USB_GSPCA_TOUPTEK is not set
++# CONFIG_USB_GSPCA_TV8532 is not set
++# CONFIG_USB_GSPCA_VC032X is not set
++# CONFIG_USB_GSPCA_VICAM is not set
++# CONFIG_USB_GSPCA_XIRLINK_CIT is not set
++# CONFIG_USB_GSPCA_ZC3XX is not set
++# CONFIG_USB_PWC is not set
++# CONFIG_VIDEO_CPIA2 is not set
++# CONFIG_USB_ZR364XX is not set
++# CONFIG_USB_STKWEBCAM is not set
++# CONFIG_USB_S2255 is not set
++# CONFIG_VIDEO_USBTV is not set
++
++#
++# Webcam, TV (analog/digital) USB devices
++#
++# CONFIG_VIDEO_EM28XX is not set
++# CONFIG_MEDIA_PCI_SUPPORT is not set
++CONFIG_V4L_PLATFORM_DRIVERS=y
++# CONFIG_VIDEO_CAFE_CCIC is not set
++# CONFIG_VIDEO_CADENCE is not set
++# CONFIG_SOC_CAMERA is not set
++# CONFIG_V4L_MEM2MEM_DRIVERS is not set
++# CONFIG_V4L_TEST_DRIVERS is not set
++
++#
++# Supported MMC/SDIO adapters
++#
++# CONFIG_CYPRESS_FIRMWARE is not set
++CONFIG_VIDEOBUF2_CORE=y
++CONFIG_VIDEOBUF2_V4L2=y
++CONFIG_VIDEOBUF2_MEMOPS=y
++CONFIG_VIDEOBUF2_VMALLOC=y
++
++#
++# Media ancillary drivers (tuners, sensors, i2c, spi, frontends)
++#
++CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
++
++#
++# Audio decoders, processors and mixers
++#
++
++#
++# RDS decoders
++#
++
++#
++# Video decoders
++#
++
++#
++# Video and audio decoders
++#
++
++#
++# Video encoders
++#
++
++#
++# Camera sensor devices
++#
++
++#
++# Flash devices
++#
++
++#
++# Video improvement chips
++#
++
++#
++# Audio/Video compression chips
++#
++
++#
++# SDR tuner chips
++#
++
++#
++# Miscellaneous helper chips
++#
++
++#
++# Sensors used on soc_camera driver
++#
++
++#
++# Media SPI Adapters
++#
++
++#
++# Tools to develop new frontends
++#
++
++#
++# Graphics support
++#
++CONFIG_VGA_ARB=y
++CONFIG_VGA_ARB_MAX_GPUS=16
++# CONFIG_DRM is not set
++# CONFIG_DRM_DP_CEC is not set
++
++#
++# ACP (Audio CoProcessor) Configuration
++#
++
++#
++# AMD Library routines
++#
++
++#
++# Frame buffer Devices
++#
++CONFIG_FB_CMDLINE=y
++CONFIG_FB_NOTIFY=y
++CONFIG_FB=y
++# CONFIG_FIRMWARE_EDID is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
++# CONFIG_FB_MODE_HELPERS is not set
++# CONFIG_FB_TILEBLITTING is not set
++
++#
++# Frame buffer hardware drivers
++#
++# CONFIG_FB_CIRRUS is not set
++# CONFIG_FB_PM2 is not set
++# CONFIG_FB_ARMCLCD is not set
++# CONFIG_FB_CYBER2000 is not set
++# CONFIG_FB_ASILIANT is not set
++# CONFIG_FB_IMSTT is not set
++# CONFIG_FB_OPENCORES is not set
++# CONFIG_FB_S1D13XXX is not set
++# CONFIG_FB_NVIDIA is not set
++# CONFIG_FB_RIVA is not set
++# CONFIG_FB_I740 is not set
++# CONFIG_FB_MATROX is not set
++# CONFIG_FB_RADEON is not set
++# CONFIG_FB_ATY128 is not set
++# CONFIG_FB_ATY is not set
++# CONFIG_FB_S3 is not set
++# CONFIG_FB_SAVAGE is not set
++# CONFIG_FB_SIS is not set
++# CONFIG_FB_NEOMAGIC is not set
++# CONFIG_FB_KYRO is not set
++# CONFIG_FB_3DFX is not set
++# CONFIG_FB_VOODOO1 is not set
++# CONFIG_FB_VT8623 is not set
++# CONFIG_FB_TRIDENT is not set
++# CONFIG_FB_ARK is not set
++# CONFIG_FB_PM3 is not set
++# CONFIG_FB_CARMINE is not set
++# CONFIG_FB_SMSCUFX is not set
++# CONFIG_FB_UDL is not set
++# CONFIG_FB_IBM_GXT4500 is not set
++# CONFIG_FB_VIRTUAL is not set
++# CONFIG_FB_METRONOME is not set
++# CONFIG_FB_MB862XX is not set
++# CONFIG_FB_BROADSHEET is not set
++# CONFIG_FB_SIMPLE is not set
++# CONFIG_FB_SSD1307 is not set
++# CONFIG_FB_SM712 is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Console display driver support
++#
++CONFIG_DUMMY_CONSOLE=y
++CONFIG_DUMMY_CONSOLE_COLUMNS=80
++CONFIG_DUMMY_CONSOLE_ROWS=25
++# CONFIG_FRAMEBUFFER_CONSOLE is not set
++# CONFIG_LOGO is not set
++CONFIG_SOUND=y
++CONFIG_SND=y
++CONFIG_SND_TIMER=y
++CONFIG_SND_PCM=y
++# CONFIG_SND_OSSEMUL is not set
++CONFIG_SND_PCM_TIMER=y
++# CONFIG_SND_HRTIMER is not set
++# CONFIG_SND_DYNAMIC_MINORS is not set
++CONFIG_SND_SUPPORT_OLD_API=y
++CONFIG_SND_PROC_FS=y
++CONFIG_SND_VERBOSE_PROCFS=y
++# CONFIG_SND_VERBOSE_PRINTK is not set
++# CONFIG_SND_DEBUG is not set
++# CONFIG_SND_SEQUENCER is not set
++CONFIG_SND_DRIVERS=y
++# CONFIG_SND_DUMMY is not set
++# CONFIG_SND_ALOOP is not set
++# CONFIG_SND_MTPAV is not set
++# CONFIG_SND_SERIAL_U16550 is not set
++# CONFIG_SND_MPU401 is not set
++CONFIG_SND_PCI=y
++# CONFIG_SND_AD1889 is not set
++# CONFIG_SND_ATIIXP is not set
++# CONFIG_SND_ATIIXP_MODEM is not set
++# CONFIG_SND_AU8810 is not set
++# CONFIG_SND_AU8820 is not set
++# CONFIG_SND_AU8830 is not set
++# CONFIG_SND_AW2 is not set
++# CONFIG_SND_BT87X is not set
++# CONFIG_SND_CA0106 is not set
++# CONFIG_SND_CMIPCI is not set
++# CONFIG_SND_OXYGEN is not set
++# CONFIG_SND_CS4281 is not set
++# CONFIG_SND_CS46XX is not set
++# CONFIG_SND_CTXFI is not set
++# CONFIG_SND_DARLA20 is not set
++# CONFIG_SND_GINA20 is not set
++# CONFIG_SND_LAYLA20 is not set
++# CONFIG_SND_DARLA24 is not set
++# CONFIG_SND_GINA24 is not set
++# CONFIG_SND_LAYLA24 is not set
++# CONFIG_SND_MONA is not set
++# CONFIG_SND_MIA is not set
++# CONFIG_SND_ECHO3G is not set
++# CONFIG_SND_INDIGO is not set
++# CONFIG_SND_INDIGOIO is not set
++# CONFIG_SND_INDIGODJ is not set
++# CONFIG_SND_INDIGOIOX is not set
++# CONFIG_SND_INDIGODJX is not set
++# CONFIG_SND_ENS1370 is not set
++# CONFIG_SND_ENS1371 is not set
++# CONFIG_SND_FM801 is not set
++# CONFIG_SND_HDSP is not set
++# CONFIG_SND_HDSPM is not set
++# CONFIG_SND_ICE1724 is not set
++# CONFIG_SND_INTEL8X0 is not set
++# CONFIG_SND_INTEL8X0M is not set
++# CONFIG_SND_KORG1212 is not set
++# CONFIG_SND_LOLA is not set
++# CONFIG_SND_LX6464ES is not set
++# CONFIG_SND_MIXART is not set
++# CONFIG_SND_NM256 is not set
++# CONFIG_SND_PCXHR is not set
++# CONFIG_SND_RIPTIDE is not set
++# CONFIG_SND_RME32 is not set
++# CONFIG_SND_RME96 is not set
++# CONFIG_SND_RME9652 is not set
++# CONFIG_SND_SE6X is not set
++# CONFIG_SND_VIA82XX is not set
++# CONFIG_SND_VIA82XX_MODEM is not set
++# CONFIG_SND_VIRTUOSO is not set
++# CONFIG_SND_VX222 is not set
++# CONFIG_SND_YMFPCI is not set
++
++#
++# HD-Audio
++#
++# CONFIG_SND_HDA_INTEL is not set
++CONFIG_SND_HDA_PREALLOC_SIZE=64
++CONFIG_SND_SPI=y
++CONFIG_SND_USB=y
++# CONFIG_SND_USB_AUDIO is not set
++# CONFIG_SND_USB_UA101 is not set
++# CONFIG_SND_USB_CAIAQ is not set
++# CONFIG_SND_USB_6FIRE is not set
++# CONFIG_SND_USB_HIFACE is not set
++# CONFIG_SND_BCD2000 is not set
++# CONFIG_SND_USB_POD is not set
++# CONFIG_SND_USB_PODHD is not set
++# CONFIG_SND_USB_TONEPORT is not set
++# CONFIG_SND_USB_VARIAX is not set
++# CONFIG_SND_SOC is not set
++
++#
++# HID support
++#
++CONFIG_HID=y
++# CONFIG_HID_BATTERY_STRENGTH is not set
++# CONFIG_HIDRAW is not set
++# CONFIG_UHID is not set
++CONFIG_HID_GENERIC=y
++
++#
++# Special HID drivers
++#
++CONFIG_HID_A4TECH=y
++# CONFIG_HID_ACCUTOUCH is not set
++# CONFIG_HID_ACRUX is not set
++CONFIG_HID_APPLE=y
++# CONFIG_HID_APPLEIR is not set
++# CONFIG_HID_AUREAL is not set
++CONFIG_HID_BELKIN=y
++# CONFIG_HID_BETOP_FF is not set
++CONFIG_HID_CHERRY=y
++CONFIG_HID_CHICONY=y
++# CONFIG_HID_COUGAR is not set
++# CONFIG_HID_PRODIKEYS is not set
++# CONFIG_HID_CMEDIA is not set
++CONFIG_HID_CYPRESS=y
++# CONFIG_HID_DRAGONRISE is not set
++# CONFIG_HID_EMS_FF is not set
++# CONFIG_HID_ELECOM is not set
++# CONFIG_HID_ELO is not set
++CONFIG_HID_EZKEY=y
++# CONFIG_HID_GEMBIRD is not set
++# CONFIG_HID_GFRM is not set
++# CONFIG_HID_HOLTEK is not set
++# CONFIG_HID_KEYTOUCH is not set
++# CONFIG_HID_KYE is not set
++# CONFIG_HID_UCLOGIC is not set
++# CONFIG_HID_WALTOP is not set
++# CONFIG_HID_GYRATION is not set
++# CONFIG_HID_ICADE is not set
++# CONFIG_HID_ITE is not set
++# CONFIG_HID_JABRA is not set
++# CONFIG_HID_TWINHAN is not set
++CONFIG_HID_KENSINGTON=y
++# CONFIG_HID_LCPOWER is not set
++# CONFIG_HID_LENOVO is not set
++CONFIG_HID_LOGITECH=y
++# CONFIG_HID_LOGITECH_HIDPP is not set
++# CONFIG_LOGITECH_FF is not set
++# CONFIG_LOGIRUMBLEPAD2_FF is not set
++# CONFIG_LOGIG940_FF is not set
++# CONFIG_LOGIWHEELS_FF is not set
++# CONFIG_HID_MAGICMOUSE is not set
++# CONFIG_HID_MAYFLASH is not set
++# CONFIG_HID_REDRAGON is not set
++CONFIG_HID_MICROSOFT=y
++CONFIG_HID_MONTEREY=y
++# CONFIG_HID_MULTITOUCH is not set
++# CONFIG_HID_NTI is not set
++# CONFIG_HID_NTRIG is not set
++# CONFIG_HID_ORTEK is not set
++# CONFIG_HID_PANTHERLORD is not set
++# CONFIG_HID_PENMOUNT is not set
++# CONFIG_HID_PETALYNX is not set
++# CONFIG_HID_PICOLCD is not set
++# CONFIG_HID_PLANTRONICS is not set
++# CONFIG_HID_PRIMAX is not set
++# CONFIG_HID_RETRODE is not set
++# CONFIG_HID_ROCCAT is not set
++# CONFIG_HID_SAITEK is not set
++# CONFIG_HID_SAMSUNG is not set
++# CONFIG_HID_SPEEDLINK is not set
++# CONFIG_HID_STEAM is not set
++# CONFIG_HID_STEELSERIES is not set
++# CONFIG_HID_SUNPLUS is not set
++# CONFIG_HID_RMI is not set
++# CONFIG_HID_GREENASIA is not set
++# CONFIG_HID_SMARTJOYPLUS is not set
++# CONFIG_HID_TIVO is not set
++# CONFIG_HID_TOPSEED is not set
++# CONFIG_HID_THRUSTMASTER is not set
++# CONFIG_HID_UDRAW_PS3 is not set
++# CONFIG_HID_WACOM is not set
++# CONFIG_HID_XINMO is not set
++# CONFIG_HID_ZEROPLUS is not set
++# CONFIG_HID_ZYDACRON is not set
++# CONFIG_HID_SENSOR_HUB is not set
++# CONFIG_HID_ALPS is not set
++
++#
++# USB HID support
++#
++CONFIG_USB_HID=y
++# CONFIG_HID_PID is not set
++# CONFIG_USB_HIDDEV is not set
++
++#
++# I2C HID support
++#
++# CONFIG_I2C_HID is not set
++CONFIG_USB_OHCI_LITTLE_ENDIAN=y
++CONFIG_USB_SUPPORT=y
++CONFIG_USB_COMMON=y
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB=y
++CONFIG_USB_PCI=y
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
++
++#
++# Miscellaneous USB options
++#
++CONFIG_USB_DEFAULT_PERSIST=y
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_OTG is not set
++# CONFIG_USB_OTG_WHITELIST is not set
++# CONFIG_USB_OTG_BLACKLIST_HUB is not set
++# CONFIG_USB_MON is not set
++# CONFIG_USB_WUSB_CBAF is not set
++
++#
++# USB Host Controller Drivers
++#
++# CONFIG_USB_C67X00_HCD is not set
++CONFIG_USB_XHCI_HCD=y
++# CONFIG_USB_XHCI_DBGCAP is not set
++CONFIG_USB_XHCI_PCI=y
++CONFIG_USB_XHCI_PLATFORM=y
++# CONFIG_USB_EHCI_HCD is not set
++# CONFIG_USB_OXU210HP_HCD is not set
++# CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_FOTG210_HCD is not set
++# CONFIG_USB_MAX3421_HCD is not set
++# CONFIG_USB_OHCI_HCD is not set
++# CONFIG_USB_UHCI_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++# CONFIG_USB_HCD_TEST_MODE is not set
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
++CONFIG_USB_WDM=y
++# CONFIG_USB_TMC is not set
++
++#
++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
++#
++
++#
++# also be needed; see USB_STORAGE Help for more info
++#
++CONFIG_USB_STORAGE=y
++# CONFIG_USB_STORAGE_DEBUG is not set
++# CONFIG_USB_STORAGE_REALTEK is not set
++# CONFIG_USB_STORAGE_DATAFAB is not set
++# CONFIG_USB_STORAGE_FREECOM is not set
++# CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_USBAT is not set
++# CONFIG_USB_STORAGE_SDDR09 is not set
++# CONFIG_USB_STORAGE_SDDR55 is not set
++# CONFIG_USB_STORAGE_JUMPSHOT is not set
++# CONFIG_USB_STORAGE_ALAUDA is not set
++# CONFIG_USB_STORAGE_ONETOUCH is not set
++# CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
++# CONFIG_USB_STORAGE_ENE_UB6250 is not set
++CONFIG_USB_UAS=y
++
++#
++# USB Imaging devices
++#
++# CONFIG_USB_MDC800 is not set
++# CONFIG_USB_MICROTEK is not set
++# CONFIG_USBIP_CORE is not set
++# CONFIG_USB_MUSB_HDRC is not set
++CONFIG_USB_DWC3=y
++# CONFIG_USB_DWC3_HOST is not set
++CONFIG_USB_DWC3_GADGET=y
++
++#
++# Platform Glue Driver Support
++#
++# CONFIG_USB_DWC3_HAPS is not set
++# CONFIG_USB_DWC3_OF_SIMPLE is not set
++# CONFIG_USB_DWC2 is not set
++# CONFIG_USB_CHIPIDEA is not set
++# CONFIG_USB_ISP1760 is not set
++
++#
++# USB port drivers
++#
++CONFIG_USB_SERIAL=y
++# CONFIG_USB_SERIAL_CONSOLE is not set
++# CONFIG_USB_SERIAL_GENERIC is not set
++# CONFIG_USB_SERIAL_SIMPLE is not set
++# CONFIG_USB_SERIAL_AIRCABLE is not set
++# CONFIG_USB_SERIAL_ARK3116 is not set
++# CONFIG_USB_SERIAL_BELKIN is not set
++# CONFIG_USB_SERIAL_CH341 is not set
++# CONFIG_USB_SERIAL_WHITEHEAT is not set
++# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
++CONFIG_USB_SERIAL_CP210X=y
++# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
++# CONFIG_USB_SERIAL_EMPEG is not set
++# CONFIG_USB_SERIAL_FTDI_SIO is not set
++# CONFIG_USB_SERIAL_VISOR is not set
++# CONFIG_USB_SERIAL_IPAQ is not set
++# CONFIG_USB_SERIAL_IR is not set
++# CONFIG_USB_SERIAL_EDGEPORT is not set
++# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
++# CONFIG_USB_SERIAL_F81232 is not set
++# CONFIG_USB_SERIAL_F8153X is not set
++# CONFIG_USB_SERIAL_GARMIN is not set
++# CONFIG_USB_SERIAL_IPW is not set
++# CONFIG_USB_SERIAL_IUU is not set
++# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
++# CONFIG_USB_SERIAL_KEYSPAN is not set
++# CONFIG_USB_SERIAL_KLSI is not set
++# CONFIG_USB_SERIAL_KOBIL_SCT is not set
++# CONFIG_USB_SERIAL_MCT_U232 is not set
++# CONFIG_USB_SERIAL_METRO is not set
++# CONFIG_USB_SERIAL_MOS7720 is not set
++# CONFIG_USB_SERIAL_MOS7840 is not set
++# CONFIG_USB_SERIAL_MXUPORT is not set
++# CONFIG_USB_SERIAL_NAVMAN is not set
++# CONFIG_USB_SERIAL_PL2303 is not set
++# CONFIG_USB_SERIAL_OTI6858 is not set
++# CONFIG_USB_SERIAL_QCAUX is not set
++# CONFIG_USB_SERIAL_QUALCOMM is not set
++# CONFIG_USB_SERIAL_SPCP8X5 is not set
++# CONFIG_USB_SERIAL_SAFE is not set
++# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
++# CONFIG_USB_SERIAL_SYMBOL is not set
++# CONFIG_USB_SERIAL_TI is not set
++# CONFIG_USB_SERIAL_CYBERJACK is not set
++# CONFIG_USB_SERIAL_XIRCOM is not set
++CONFIG_USB_SERIAL_WWAN=y
++CONFIG_USB_SERIAL_OPTION=y
++# CONFIG_USB_SERIAL_OMNINET is not set
++# CONFIG_USB_SERIAL_OPTICON is not set
++# CONFIG_USB_SERIAL_XSENS_MT is not set
++# CONFIG_USB_SERIAL_WISHBONE is not set
++# CONFIG_USB_SERIAL_SSU100 is not set
++# CONFIG_USB_SERIAL_QT2 is not set
++# CONFIG_USB_SERIAL_UPD78F0730 is not set
++# CONFIG_USB_SERIAL_DEBUG is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_SEVSEG is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
++# CONFIG_USB_TEST is not set
++# CONFIG_USB_EHSET_TEST_FIXTURE is not set
++# CONFIG_USB_ISIGHTFW is not set
++# CONFIG_USB_YUREX is not set
++# CONFIG_USB_EZUSB_FX2 is not set
++# CONFIG_USB_HUB_USB251XB is not set
++# CONFIG_USB_HSIC_USB3503 is not set
++# CONFIG_USB_HSIC_USB4604 is not set
++# CONFIG_USB_LINK_LAYER_TEST is not set
++
++#
++# USB Physical Layer drivers
++#
++# CONFIG_NOP_USB_XCEIV is not set
++# CONFIG_USB_GPIO_VBUS is not set
++# CONFIG_USB_ISP1301 is not set
++# CONFIG_USB_ULPI is not set
++CONFIG_USB_GADGET=y
++# CONFIG_USB_GADGET_DEBUG is not set
++# CONFIG_USB_GADGET_DEBUG_FILES is not set
++# CONFIG_USB_GADGET_DEBUG_FS is not set
++CONFIG_USB_GADGET_VBUS_DRAW=2
++CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
++# CONFIG_U_SERIAL_CONSOLE is not set
++
++#
++# USB Peripheral Controller
++#
++# CONFIG_USB_FOTG210_UDC is not set
++# CONFIG_USB_GR_UDC is not set
++# CONFIG_USB_R8A66597 is not set
++# CONFIG_USB_PXA27X is not set
++# CONFIG_USB_MV_UDC is not set
++# CONFIG_USB_MV_U3D is not set
++# CONFIG_USB_SNP_UDC_PLAT is not set
++# CONFIG_USB_M66592 is not set
++# CONFIG_USB_BDC_UDC is not set
++# CONFIG_USB_AMD5536UDC is not set
++# CONFIG_USB_NET2272 is not set
++# CONFIG_USB_NET2280 is not set
++# CONFIG_USB_GOKU is not set
++# CONFIG_USB_EG20T is not set
++# CONFIG_USB_GADGET_XILINX is not set
++# CONFIG_USB_DUMMY_HCD is not set
++CONFIG_USB_LIBCOMPOSITE=y
++CONFIG_USB_F_ACM=y
++CONFIG_USB_U_SERIAL=y
++CONFIG_USB_U_ETHER=y
++CONFIG_USB_U_AUDIO=y
++CONFIG_USB_F_RNDIS=y
++CONFIG_USB_F_MASS_STORAGE=y
++CONFIG_USB_F_UAC1=y
++CONFIG_USB_F_UVC=y
++CONFIG_USB_CONFIGFS=y
++# CONFIG_USB_CONFIGFS_SERIAL is not set
++CONFIG_USB_CONFIGFS_ACM=y
++# CONFIG_USB_CONFIGFS_OBEX is not set
++# CONFIG_USB_CONFIGFS_NCM is not set
++# CONFIG_USB_CONFIGFS_ECM is not set
++# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set
++CONFIG_USB_CONFIGFS_RNDIS=y
++# CONFIG_USB_CONFIGFS_EEM is not set
++CONFIG_USB_CONFIGFS_MASS_STORAGE=y
++# CONFIG_USB_CONFIGFS_F_LB_SS is not set
++# CONFIG_USB_CONFIGFS_F_FS is not set
++CONFIG_USB_CONFIGFS_F_UAC1=y
++# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set
++# CONFIG_USB_CONFIGFS_F_UAC2 is not set
++# CONFIG_USB_CONFIGFS_F_MIDI is not set
++# CONFIG_USB_CONFIGFS_F_HID is not set
++CONFIG_USB_CONFIGFS_F_UVC=y
++# CONFIG_USB_CONFIGFS_F_PRINTER is not set
++CONFIG_MPP_TO_GADGET_UVC=y
++# CONFIG_TYPEC is not set
++# CONFIG_USB_ROLE_SWITCH is not set
++# CONFIG_USB_ULPI_BUS is not set
++# CONFIG_UWB is not set
++CONFIG_MMC=y
++CONFIG_PWRSEQ_EMMC=y
++CONFIG_PWRSEQ_SIMPLE=y
++CONFIG_MMC_BLOCK=y
++CONFIG_MMC_BLOCK_MINORS=8
++# CONFIG_SDIO_UART is not set
++# CONFIG_MMC_TEST is not set
++
++#
++# MMC/SD/SDIO Host Controller Drivers
++#
++# CONFIG_MMC_DEBUG is not set
++# CONFIG_MMC_ARMMMCI is not set
++CONFIG_MMC_SDHCI=y
++CONFIG_MMC_SDHCI_IO_ACCESSORS=y
++# CONFIG_MMC_SDHCI_PCI is not set
++CONFIG_MMC_SDHCI_PLTFM=y
++# CONFIG_MMC_SDHCI_OF_ARASAN is not set
++# CONFIG_MMC_SDHCI_OF_AT91 is not set
++# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set
++# CONFIG_MMC_SDHCI_CADENCE is not set
++CONFIG_MMC_SDHCI_BSP=y
++# CONFIG_MMC_SDHCI_F_SDH30 is not set
++# CONFIG_MMC_TIFM_SD is not set
++# CONFIG_MMC_SPI is not set
++# CONFIG_MMC_CB710 is not set
++# CONFIG_MMC_VIA_SDMMC is not set
++# CONFIG_MMC_DW is not set
++# CONFIG_MMC_VUB300 is not set
++# CONFIG_MMC_USHC is not set
++# CONFIG_MMC_USDHI6ROL0 is not set
++CONFIG_MMC_CQHCI=y
++# CONFIG_MMC_TOSHIBA_PCI is not set
++# CONFIG_MMC_MTK is not set
++# CONFIG_MMC_SDHCI_XENON is not set
++# CONFIG_MMC_SDHCI_OMAP is not set
++# CONFIG_MMC_CQ_HCI is not set
++# CONFIG_MEMSTICK is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_ACCESSIBILITY is not set
++# CONFIG_INFINIBAND is not set
++CONFIG_EDAC_SUPPORT=y
++CONFIG_RTC_LIB=y
++CONFIG_RTC_CLASS=y
++CONFIG_RTC_HCTOSYS=y
++CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
++CONFIG_RTC_SYSTOHC=y
++CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
++# CONFIG_RTC_DEBUG is not set
++CONFIG_RTC_NVMEM=y
++
++#
++# RTC interfaces
++#
++CONFIG_RTC_INTF_SYSFS=y
++CONFIG_RTC_INTF_PROC=y
++CONFIG_RTC_INTF_DEV=y
++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
++# CONFIG_RTC_DRV_TEST is not set
++
++#
++# I2C RTC drivers
++#
++# CONFIG_RTC_DRV_ABB5ZES3 is not set
++# CONFIG_RTC_DRV_ABX80X is not set
++# CONFIG_RTC_DRV_DS1307 is not set
++# CONFIG_RTC_DRV_DS1374 is not set
++# CONFIG_RTC_DRV_DS1672 is not set
++# CONFIG_RTC_DRV_HYM8563 is not set
++# CONFIG_RTC_DRV_MAX6900 is not set
++# CONFIG_RTC_DRV_RS5C372 is not set
++# CONFIG_RTC_DRV_ISL1208 is not set
++# CONFIG_RTC_DRV_ISL12022 is not set
++# CONFIG_RTC_DRV_ISL12026 is not set
++# CONFIG_RTC_DRV_X1205 is not set
++# CONFIG_RTC_DRV_PCF8523 is not set
++# CONFIG_RTC_DRV_PCF85063 is not set
++# CONFIG_RTC_DRV_PCF85363 is not set
++# CONFIG_RTC_DRV_PCF8563 is not set
++# CONFIG_RTC_DRV_PCF8583 is not set
++# CONFIG_RTC_DRV_M41T80 is not set
++# CONFIG_RTC_DRV_BQ32K is not set
++# CONFIG_RTC_DRV_S35390A is not set
++# CONFIG_RTC_DRV_FM3130 is not set
++# CONFIG_RTC_DRV_RX8010 is not set
++# CONFIG_RTC_DRV_RX8581 is not set
++# CONFIG_RTC_DRV_RX8025 is not set
++# CONFIG_RTC_DRV_EM3027 is not set
++CONFIG_RTC_DRV_RV8803=y
++
++#
++# SPI RTC drivers
++#
++# CONFIG_RTC_DRV_M41T93 is not set
++# CONFIG_RTC_DRV_M41T94 is not set
++# CONFIG_RTC_DRV_DS1302 is not set
++# CONFIG_RTC_DRV_DS1305 is not set
++# CONFIG_RTC_DRV_DS1343 is not set
++# CONFIG_RTC_DRV_DS1347 is not set
++# CONFIG_RTC_DRV_DS1390 is not set
++# CONFIG_RTC_DRV_MAX6916 is not set
++# CONFIG_RTC_DRV_R9701 is not set
++# CONFIG_RTC_DRV_RX4581 is not set
++# CONFIG_RTC_DRV_RX6110 is not set
++# CONFIG_RTC_DRV_RS5C348 is not set
++# CONFIG_RTC_DRV_MAX6902 is not set
++# CONFIG_RTC_DRV_PCF2123 is not set
++# CONFIG_RTC_DRV_MCP795 is not set
++CONFIG_RTC_I2C_AND_SPI=y
++
++#
++# SPI and I2C RTC drivers
++#
++# CONFIG_RTC_DRV_DS3232 is not set
++# CONFIG_RTC_DRV_PCF2127 is not set
++# CONFIG_RTC_DRV_RV3029C2 is not set
++
++#
++# Platform RTC drivers
++#
++# CONFIG_RTC_DRV_BSP is not set
++# CONFIG_RTC_DRV_DS1286 is not set
++# CONFIG_RTC_DRV_DS1511 is not set
++# CONFIG_RTC_DRV_DS1553 is not set
++# CONFIG_RTC_DRV_DS1685_FAMILY is not set
++# CONFIG_RTC_DRV_DS1742 is not set
++# CONFIG_RTC_DRV_DS2404 is not set
++# CONFIG_RTC_DRV_STK17TA8 is not set
++# CONFIG_RTC_DRV_M48T86 is not set
++# CONFIG_RTC_DRV_M48T35 is not set
++# CONFIG_RTC_DRV_M48T59 is not set
++# CONFIG_RTC_DRV_MSM6242 is not set
++# CONFIG_RTC_DRV_BQ4802 is not set
++# CONFIG_RTC_DRV_RP5C01 is not set
++# CONFIG_RTC_DRV_V3020 is not set
++# CONFIG_RTC_DRV_ZYNQMP is not set
++
++#
++# on-CPU RTC drivers
++#
++# CONFIG_RTC_DRV_PL030 is not set
++# CONFIG_RTC_DRV_PL031 is not set
++# CONFIG_RTC_DRV_FTRTC010 is not set
++# CONFIG_RTC_DRV_SNVS is not set
++# CONFIG_RTC_DRV_R7301 is not set
++
++#
++# HID Sensor RTC drivers
++#
++# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set
++CONFIG_DMADEVICES=y
++# CONFIG_DMADEVICES_DEBUG is not set
++
++#
++# DMA Devices
++#
++CONFIG_DMA_ENGINE=y
++CONFIG_DMA_VIRTUAL_CHANNELS=y
++CONFIG_DMA_OF=y
++# CONFIG_ALTERA_MSGDMA is not set
++# CONFIG_AMBA_PL08X is not set
++# CONFIG_DW_AXI_DMAC is not set
++# CONFIG_FSL_EDMA is not set
++# CONFIG_INTEL_IDMA64 is not set
++CONFIG_EDMACV310=y
++# CONFIG_MV_XOR_V2 is not set
++# CONFIG_PL330_DMA is not set
++# CONFIG_XILINX_DMA is not set
++# CONFIG_XILINX_ZYNQMP_DMA is not set
++# CONFIG_QCOM_HIDMA_MGMT is not set
++# CONFIG_QCOM_HIDMA is not set
++# CONFIG_DW_DMAC is not set
++# CONFIG_DW_DMAC_PCI is not set
++
++#
++# DMA Clients
++#
++# CONFIG_ASYNC_TX_DMA is not set
++# CONFIG_DMATEST is not set
++
++#
++# DMABUF options
++#
++# CONFIG_SYNC_FILE is not set
++# CONFIG_AUXDISPLAY is not set
++# CONFIG_UIO is not set
++# CONFIG_VFIO is not set
++# CONFIG_VIRT_DRIVERS is not set
++# CONFIG_VIRTIO_MENU is not set
++
++#
++# Microsoft Hyper-V guest support
++#
++# CONFIG_STAGING is not set
++# CONFIG_GOLDFISH is not set
++# CONFIG_CHROME_PLATFORMS is not set
++CONFIG_CLKDEV_LOOKUP=y
++CONFIG_HAVE_CLK_PREPARE=y
++CONFIG_COMMON_CLK=y
++
++#
++# Common Clock Framework
++#
++# CONFIG_COMMON_CLK_VERSATILE is not set
++# CONFIG_CLK_HSDK is not set
++# CONFIG_COMMON_CLK_MAX9485 is not set
++# CONFIG_COMMON_CLK_SI5351 is not set
++# CONFIG_COMMON_CLK_SI514 is not set
++# CONFIG_COMMON_CLK_SI544 is not set
++# CONFIG_COMMON_CLK_SI570 is not set
++# CONFIG_COMMON_CLK_CDCE706 is not set
++# CONFIG_COMMON_CLK_CDCE925 is not set
++# CONFIG_COMMON_CLK_CS2000_CP is not set
++# CONFIG_CLK_QORIQ is not set
++# CONFIG_COMMON_CLK_XGENE is not set
++# CONFIG_COMMON_CLK_PWM is not set
++# CONFIG_COMMON_CLK_VC5 is not set
++CONFIG_COMMON_CLK_SS928V100=y
++CONFIG_RESET_BSP=y
++# CONFIG_HWSPINLOCK is not set
++
++#
++# Clock Source drivers
++#
++CONFIG_TIMER_OF=y
++CONFIG_TIMER_PROBE=y
++CONFIG_CLKSRC_MMIO=y
++CONFIG_ARM_ARCH_TIMER=y
++CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
++CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y
++# CONFIG_ARM_ARCH_TIMER_VCT_ACCESS is not set
++# CONFIG_FSL_ERRATUM_A008585 is not set
++CONFIG_HISILICON_ERRATUM_161010101=y
++CONFIG_ARM64_ERRATUM_858921=y
++CONFIG_ARM_TIMER_SP804=y
++# CONFIG_TIMER_BSP_SP804 is not set
++# CONFIG_MAILBOX is not set
++CONFIG_IOMMU_API=y
++CONFIG_IOMMU_SUPPORT=y
++
++#
++# Generic IOMMU Pagetable Support
++#
++CONFIG_IOMMU_IO_PGTABLE=y
++CONFIG_IOMMU_IO_PGTABLE_LPAE=y
++# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set
++# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set
++
++#
++# Generic PASID table support
++#
++CONFIG_IOMMU_PASID_TABLE=y
++CONFIG_ARM_SMMU_V3_CONTEXT=y
++# CONFIG_IOMMU_DEBUGFS is not set
++# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
++CONFIG_IOMMU_IOVA=y
++CONFIG_OF_IOMMU=y
++CONFIG_IOMMU_DMA=y
++CONFIG_IOMMU_SVA=y
++CONFIG_IOMMU_PAGE_FAULT=y
++# CONFIG_ARM_SMMU is not set
++CONFIG_ARM_SMMU_V3=y
++
++#
++# Remoteproc drivers
++#
++# CONFIG_REMOTEPROC is not set
++
++#
++# Rpmsg drivers
++#
++# CONFIG_RPMSG_VIRTIO is not set
++
++#
++# SOC (System On Chip) specific Drivers
++#
++
++#
++# Amlogic SoC drivers
++#
++
++#
++# Broadcom SoC drivers
++#
++# CONFIG_SOC_BRCMSTB is not set
++
++#
++# NXP/Freescale QorIQ SoC drivers
++#
++
++#
++# i.MX SoC drivers
++#
++
++#
++# Qualcomm SoC drivers
++#
++# CONFIG_SOC_TI is not set
++
++#
++# Xilinx SoC drivers
++#
++# CONFIG_XILINX_VCU is not set
++CONFIG_PM_DEVFREQ=y
++
++#
++# DEVFREQ Governors
++#
++CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
++# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set
++# CONFIG_DEVFREQ_GOV_POWERSAVE is not set
++# CONFIG_DEVFREQ_GOV_USERSPACE is not set
++# CONFIG_DEVFREQ_GOV_PASSIVE is not set
++
++#
++# DEVFREQ Drivers
++#
++# CONFIG_PM_DEVFREQ_EVENT is not set
++# CONFIG_EXTCON is not set
++# CONFIG_MEMORY is not set
++CONFIG_IIO=y
++# CONFIG_IIO_BUFFER is not set
++# CONFIG_IIO_CONFIGFS is not set
++# CONFIG_IIO_TRIGGER is not set
++# CONFIG_IIO_SW_DEVICE is not set
++# CONFIG_IIO_SW_TRIGGER is not set
++
++#
++# Accelerometers
++#
++# CONFIG_ADIS16201 is not set
++# CONFIG_ADIS16209 is not set
++# CONFIG_ADXL345_I2C is not set
++# CONFIG_ADXL345_SPI is not set
++# CONFIG_BMA180 is not set
++# CONFIG_BMA220 is not set
++# CONFIG_BMC150_ACCEL is not set
++# CONFIG_DA280 is not set
++# CONFIG_DA311 is not set
++# CONFIG_DMARD06 is not set
++# CONFIG_DMARD09 is not set
++# CONFIG_DMARD10 is not set
++# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set
++# CONFIG_IIO_ST_ACCEL_3AXIS is not set
++# CONFIG_KXSD9 is not set
++# CONFIG_KXCJK1013 is not set
++# CONFIG_MC3230 is not set
++# CONFIG_MMA7455_I2C is not set
++# CONFIG_MMA7455_SPI is not set
++# CONFIG_MMA7660 is not set
++# CONFIG_MMA8452 is not set
++# CONFIG_MMA9551 is not set
++# CONFIG_MMA9553 is not set
++# CONFIG_MXC4005 is not set
++# CONFIG_MXC6255 is not set
++# CONFIG_SCA3000 is not set
++# CONFIG_STK8312 is not set
++# CONFIG_STK8BA50 is not set
++
++#
++# Analog to digital converters
++#
++# CONFIG_AD7266 is not set
++# CONFIG_AD7291 is not set
++# CONFIG_AD7298 is not set
++# CONFIG_AD7476 is not set
++# CONFIG_AD7766 is not set
++# CONFIG_AD7791 is not set
++# CONFIG_AD7793 is not set
++# CONFIG_AD7887 is not set
++# CONFIG_AD7923 is not set
++# CONFIG_AD799X is not set
++# CONFIG_CC10001_ADC is not set
++# CONFIG_ENVELOPE_DETECTOR is not set
++# CONFIG_HI8435 is not set
++CONFIG_VENDOR_LSADC=y
++# CONFIG_HX711 is not set
++# CONFIG_INA2XX_ADC is not set
++# CONFIG_LTC2471 is not set
++# CONFIG_LTC2485 is not set
++# CONFIG_LTC2497 is not set
++# CONFIG_MAX1027 is not set
++# CONFIG_MAX11100 is not set
++# CONFIG_MAX1118 is not set
++# CONFIG_MAX1363 is not set
++# CONFIG_MAX9611 is not set
++# CONFIG_MCP320X is not set
++# CONFIG_MCP3422 is not set
++# CONFIG_NAU7802 is not set
++# CONFIG_SD_ADC_MODULATOR is not set
++# CONFIG_TI_ADC081C is not set
++# CONFIG_TI_ADC0832 is not set
++# CONFIG_TI_ADC084S021 is not set
++# CONFIG_TI_ADC12138 is not set
++# CONFIG_TI_ADC108S102 is not set
++# CONFIG_TI_ADC128S052 is not set
++# CONFIG_TI_ADC161S626 is not set
++# CONFIG_TI_ADS1015 is not set
++# CONFIG_TI_ADS7950 is not set
++# CONFIG_TI_ADS8688 is not set
++# CONFIG_TI_TLC4541 is not set
++# CONFIG_VF610_ADC is not set
++
++#
++# Analog Front Ends
++#
++# CONFIG_IIO_RESCALE is not set
++
++#
++# Amplifiers
++#
++# CONFIG_AD8366 is not set
++
++#
++# Chemical Sensors
++#
++# CONFIG_ATLAS_PH_SENSOR is not set
++# CONFIG_BME680 is not set
++# CONFIG_CCS811 is not set
++# CONFIG_IAQCORE is not set
++# CONFIG_VZ89X is not set
++
++#
++# Hid Sensor IIO Common
++#
++
++#
++# SSP Sensor Common
++#
++# CONFIG_IIO_SSP_SENSORHUB is not set
++
++#
++# Counters
++#
++
++#
++# Digital to analog converters
++#
++# CONFIG_AD5064 is not set
++# CONFIG_AD5360 is not set
++# CONFIG_AD5380 is not set
++# CONFIG_AD5421 is not set
++# CONFIG_AD5446 is not set
++# CONFIG_AD5449 is not set
++# CONFIG_AD5592R is not set
++# CONFIG_AD5593R is not set
++# CONFIG_AD5504 is not set
++# CONFIG_AD5624R_SPI is not set
++# CONFIG_LTC2632 is not set
++# CONFIG_AD5686_SPI is not set
++# CONFIG_AD5696_I2C is not set
++# CONFIG_AD5755 is not set
++# CONFIG_AD5758 is not set
++# CONFIG_AD5761 is not set
++# CONFIG_AD5764 is not set
++# CONFIG_AD5791 is not set
++# CONFIG_AD7303 is not set
++# CONFIG_AD8801 is not set
++# CONFIG_DPOT_DAC is not set
++# CONFIG_DS4424 is not set
++# CONFIG_M62332 is not set
++# CONFIG_MAX517 is not set
++# CONFIG_MAX5821 is not set
++# CONFIG_MCP4725 is not set
++# CONFIG_MCP4922 is not set
++# CONFIG_TI_DAC082S085 is not set
++# CONFIG_TI_DAC5571 is not set
++# CONFIG_VF610_DAC is not set
++
++#
++# IIO dummy driver
++#
++
++#
++# Frequency Synthesizers DDS/PLL
++#
++
++#
++# Clock Generator/Distribution
++#
++# CONFIG_AD9523 is not set
++
++#
++# Phase-Locked Loop (PLL) frequency synthesizers
++#
++# CONFIG_ADF4350 is not set
++
++#
++# Digital gyroscope sensors
++#
++# CONFIG_ADIS16080 is not set
++# CONFIG_ADIS16130 is not set
++# CONFIG_ADIS16136 is not set
++# CONFIG_ADIS16260 is not set
++# CONFIG_ADXRS450 is not set
++# CONFIG_BMG160 is not set
++# CONFIG_MPU3050_I2C is not set
++# CONFIG_IIO_ST_GYRO_3AXIS is not set
++# CONFIG_ITG3200 is not set
++
++#
++# Health Sensors
++#
++
++#
++# Heart Rate Monitors
++#
++# CONFIG_AFE4403 is not set
++# CONFIG_AFE4404 is not set
++# CONFIG_MAX30100 is not set
++# CONFIG_MAX30102 is not set
++
++#
++# Humidity sensors
++#
++# CONFIG_AM2315 is not set
++# CONFIG_DHT11 is not set
++# CONFIG_HDC100X is not set
++# CONFIG_HTS221 is not set
++# CONFIG_HTU21 is not set
++# CONFIG_SI7005 is not set
++# CONFIG_SI7020 is not set
++
++#
++# Inertial measurement units
++#
++# CONFIG_ADIS16400 is not set
++# CONFIG_ADIS16480 is not set
++# CONFIG_BMI160_I2C is not set
++# CONFIG_BMI160_SPI is not set
++# CONFIG_KMX61 is not set
++# CONFIG_INV_MPU6050_I2C is not set
++# CONFIG_INV_MPU6050_SPI is not set
++# CONFIG_IIO_ST_LSM6DSX is not set
++
++#
++# Light sensors
++#
++# CONFIG_ADJD_S311 is not set
++# CONFIG_AL3320A is not set
++# CONFIG_APDS9300 is not set
++# CONFIG_APDS9960 is not set
++# CONFIG_BH1750 is not set
++# CONFIG_BH1780 is not set
++# CONFIG_CM32181 is not set
++# CONFIG_CM3232 is not set
++# CONFIG_CM3323 is not set
++# CONFIG_CM3605 is not set
++# CONFIG_CM36651 is not set
++# CONFIG_GP2AP020A00F is not set
++# CONFIG_SENSORS_ISL29018 is not set
++# CONFIG_SENSORS_ISL29028 is not set
++# CONFIG_ISL29125 is not set
++# CONFIG_JSA1212 is not set
++# CONFIG_RPR0521 is not set
++# CONFIG_LTR501 is not set
++# CONFIG_LV0104CS is not set
++# CONFIG_MAX44000 is not set
++# CONFIG_OPT3001 is not set
++# CONFIG_PA12203001 is not set
++# CONFIG_SI1133 is not set
++# CONFIG_SI1145 is not set
++# CONFIG_STK3310 is not set
++# CONFIG_ST_UVIS25 is not set
++# CONFIG_TCS3414 is not set
++# CONFIG_TCS3472 is not set
++# CONFIG_SENSORS_TSL2563 is not set
++# CONFIG_TSL2583 is not set
++# CONFIG_TSL2772 is not set
++# CONFIG_TSL4531 is not set
++# CONFIG_US5182D is not set
++# CONFIG_VCNL4000 is not set
++# CONFIG_VEML6070 is not set
++# CONFIG_VL6180 is not set
++# CONFIG_ZOPT2201 is not set
++
++#
++# Magnetometer sensors
++#
++# CONFIG_AK8974 is not set
++# CONFIG_AK8975 is not set
++# CONFIG_AK09911 is not set
++# CONFIG_BMC150_MAGN_I2C is not set
++# CONFIG_BMC150_MAGN_SPI is not set
++# CONFIG_MAG3110 is not set
++# CONFIG_MMC35240 is not set
++# CONFIG_IIO_ST_MAGN_3AXIS is not set
++# CONFIG_SENSORS_HMC5843_I2C is not set
++# CONFIG_SENSORS_HMC5843_SPI is not set
++
++#
++# Multiplexers
++#
++# CONFIG_IIO_MUX is not set
++
++#
++# Inclinometer sensors
++#
++
++#
++# Digital potentiometers
++#
++# CONFIG_AD5272 is not set
++# CONFIG_DS1803 is not set
++# CONFIG_MAX5481 is not set
++# CONFIG_MAX5487 is not set
++# CONFIG_MCP4018 is not set
++# CONFIG_MCP4131 is not set
++# CONFIG_MCP4531 is not set
++# CONFIG_TPL0102 is not set
++
++#
++# Digital potentiostats
++#
++# CONFIG_LMP91000 is not set
++
++#
++# Pressure sensors
++#
++# CONFIG_ABP060MG is not set
++# CONFIG_BMP280 is not set
++# CONFIG_HP03 is not set
++# CONFIG_MPL115_I2C is not set
++# CONFIG_MPL115_SPI is not set
++# CONFIG_MPL3115 is not set
++# CONFIG_MS5611 is not set
++# CONFIG_MS5637 is not set
++# CONFIG_IIO_ST_PRESS is not set
++# CONFIG_T5403 is not set
++# CONFIG_HP206C is not set
++# CONFIG_ZPA2326 is not set
++
++#
++# Lightning sensors
++#
++# CONFIG_AS3935 is not set
++
++#
++# Proximity and distance sensors
++#
++# CONFIG_ISL29501 is not set
++# CONFIG_LIDAR_LITE_V2 is not set
++# CONFIG_RFD77402 is not set
++# CONFIG_SRF04 is not set
++# CONFIG_SX9500 is not set
++# CONFIG_SRF08 is not set
++
++#
++# Resolver to digital converters
++#
++# CONFIG_AD2S1200 is not set
++
++#
++# Temperature sensors
++#
++# CONFIG_MAXIM_THERMOCOUPLE is not set
++# CONFIG_MLX90614 is not set
++# CONFIG_MLX90632 is not set
++# CONFIG_TMP006 is not set
++# CONFIG_TMP007 is not set
++# CONFIG_TSYS01 is not set
++# CONFIG_TSYS02D is not set
++# CONFIG_NTB is not set
++# CONFIG_VME_BUS is not set
++CONFIG_PWM=y
++CONFIG_PWM_SYSFS=y
++# CONFIG_PWM_FSL_FTM is not set
++# CONFIG_PWM_PCA9685 is not set
++CONFIG_PWM_BSP=y
++
++#
++# IRQ chip support
++#
++CONFIG_IRQCHIP=y
++CONFIG_ARM_GIC=y
++CONFIG_ARM_GIC_MAX_NR=1
++CONFIG_ARM_GIC_V2M=y
++CONFIG_ARM_GIC_V3=y
++CONFIG_ARM_GIC_V3_ITS=y
++CONFIG_ARM_GIC_V3_ITS_PCI=y
++CONFIG_HISILICON_IRQ_MBIGEN=y
++CONFIG_PARTITION_PERCPU=y
++# CONFIG_IPACK_BUS is not set
++CONFIG_RESET_CONTROLLER=y
++# CONFIG_RESET_TI_SYSCON is not set
++# CONFIG_FMC is not set
++
++#
++# PHY Subsystem
++#
++CONFIG_GENERIC_PHY=y
++# CONFIG_PHY_XGENE is not set
++# CONFIG_BCM_KONA_USB2_PHY is not set
++# CONFIG_PHY_PXA_28NM_HSIC is not set
++# CONFIG_PHY_PXA_28NM_USB2 is not set
++# CONFIG_PHY_CPCAP_USB is not set
++# CONFIG_PHY_MAPPHONE_MDM6600 is not set
++CONFIG_VENDOR_USB_PHY=y
++CONFIG_PHY_BSP_USB3=y
++CONFIG_BSP_USB_PHY=y
++CONFIG_USB_MODE_OPTION=y
++CONFIG_USB_DRD0_IN_HOST=y
++# CONFIG_POWERCAP is not set
++# CONFIG_MCB is not set
++# CONFIG_RAS is not set
++# CONFIG_LIBNVDIMM is not set
++# CONFIG_DAX is not set
++CONFIG_NVMEM=y
++
++#
++# HW tracing support
++#
++# CONFIG_STM is not set
++# CONFIG_INTEL_TH is not set
++# CONFIG_FPGA is not set
++# CONFIG_FSI is not set
++# CONFIG_TEE is not set
++CONFIG_PM_OPP=y
++# CONFIG_SIOX is not set
++# CONFIG_SLIMBUS is not set
++
++#
++# Vendor driver support
++#
++# CONFIG_CMA_MEM_SHARED is not set
++# CONFIG_CMA_ADVANCE_SHARE is not set
++CONFIG_VENDOR_NPU=y
++
++#
++# File systems
++#
++CONFIG_DCACHE_WORD_ACCESS=y
++CONFIG_FS_IOMAP=y
++# CONFIG_EXT2_FS is not set
++# CONFIG_EXT3_FS is not set
++CONFIG_EXT4_FS=y
++CONFIG_EXT4_USE_FOR_EXT2=y
++CONFIG_EXT4_FS_POSIX_ACL=y
++CONFIG_EXT4_FS_SECURITY=y
++# CONFIG_EXT4_ENCRYPTION is not set
++# CONFIG_EXT4_DEBUG is not set
++CONFIG_JBD2=y
++# CONFIG_JBD2_DEBUG is not set
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++CONFIG_XFS_FS=y
++CONFIG_XFS_QUOTA=y
++CONFIG_XFS_POSIX_ACL=y
++CONFIG_XFS_RT=y
++# CONFIG_XFS_ONLINE_SCRUB is not set
++# CONFIG_XFS_WARN is not set
++# CONFIG_XFS_DEBUG is not set
++# CONFIG_GFS2_FS is not set
++# CONFIG_OCFS2_FS is not set
++# CONFIG_BTRFS_FS is not set
++# CONFIG_NILFS2_FS is not set
++# CONFIG_F2FS_FS is not set
++# CONFIG_FS_DAX is not set
++CONFIG_FS_POSIX_ACL=y
++CONFIG_EXPORTFS=y
++# CONFIG_EXPORTFS_BLOCK_OPS is not set
++CONFIG_FILE_LOCKING=y
++CONFIG_MANDATORY_FILE_LOCKING=y
++# CONFIG_FS_ENCRYPTION is not set
++CONFIG_FSNOTIFY=y
++CONFIG_DNOTIFY=y
++CONFIG_INOTIFY_USER=y
++# CONFIG_FANOTIFY is not set
++CONFIG_QUOTA=y
++# CONFIG_QUOTA_NETLINK_INTERFACE is not set
++CONFIG_PRINT_QUOTA_WARNING=y
++# CONFIG_QUOTA_DEBUG is not set
++CONFIG_QUOTA_TREE=m
++CONFIG_QFMT_V1=m
++CONFIG_QFMT_V2=m
++CONFIG_QUOTACTL=y
++CONFIG_AUTOFS4_FS=m
++CONFIG_AUTOFS_FS=m
++CONFIG_FUSE_FS=y
++# CONFIG_CUSE is not set
++# CONFIG_OVERLAY_FS is not set
++
++#
++# Caches
++#
++# CONFIG_FSCACHE is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++CONFIG_ISO9660_FS=y
++# CONFIG_JOLIET is not set
++# CONFIG_ZISOFS is not set
++CONFIG_UDF_FS=y
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++CONFIG_VFAT_FS=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++# CONFIG_FAT_DEFAULT_UTF8 is not set
++# CONFIG_NTFS_FS is not set
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++# CONFIG_PROC_KCORE is not set
++CONFIG_PROC_SYSCTL=y
++CONFIG_PROC_PAGE_MONITOR=y
++# CONFIG_PROC_CHILDREN is not set
++CONFIG_KERNFS=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++CONFIG_TMPFS_POSIX_ACL=y
++CONFIG_TMPFS_XATTR=y
++# CONFIG_HUGETLBFS is not set
++CONFIG_MEMFD_CREATE=y
++CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
++CONFIG_CONFIGFS_FS=y
++CONFIG_MISC_FILESYSTEMS=y
++# CONFIG_ORANGEFS_FS is not set
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_ECRYPT_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++CONFIG_CRAMFS=y
++CONFIG_CRAMFS_BLOCKDEV=y
++CONFIG_SQUASHFS=y
++CONFIG_SQUASHFS_FILE_CACHE=y
++# CONFIG_SQUASHFS_FILE_DIRECT is not set
++CONFIG_SQUASHFS_DECOMP_SINGLE=y
++# CONFIG_SQUASHFS_DECOMP_MULTI is not set
++# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set
++# CONFIG_SQUASHFS_XATTR is not set
++CONFIG_SQUASHFS_ZLIB=y
++# CONFIG_SQUASHFS_LZ4 is not set
++CONFIG_SQUASHFS_LZO=y
++CONFIG_SQUASHFS_XZ=y
++# CONFIG_SQUASHFS_ZSTD is not set
++# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
++# CONFIG_SQUASHFS_EMBEDDED is not set
++CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
++# CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_OMFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_QNX6FS_FS is not set
++# CONFIG_ROMFS_FS is not set
++# CONFIG_PSTORE is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V2=y
++CONFIG_NFS_V3=y
++CONFIG_NFS_V3_ACL=y
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_SWAP is not set
++# CONFIG_ROOT_NFS is not set
++# CONFIG_NFSD is not set
++CONFIG_GRACE_PERIOD=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_ACL_SUPPORT=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_DEBUG is not set
++# CONFIG_CEPH_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=y
++CONFIG_NLS_CODEPAGE_737=m
++CONFIG_NLS_CODEPAGE_775=m
++CONFIG_NLS_CODEPAGE_850=m
++CONFIG_NLS_CODEPAGE_852=m
++CONFIG_NLS_CODEPAGE_855=m
++CONFIG_NLS_CODEPAGE_857=m
++CONFIG_NLS_CODEPAGE_860=m
++CONFIG_NLS_CODEPAGE_861=m
++CONFIG_NLS_CODEPAGE_862=m
++CONFIG_NLS_CODEPAGE_863=m
++CONFIG_NLS_CODEPAGE_864=m
++CONFIG_NLS_CODEPAGE_865=m
++CONFIG_NLS_CODEPAGE_866=m
++CONFIG_NLS_CODEPAGE_869=m
++CONFIG_NLS_CODEPAGE_936=y
++CONFIG_NLS_CODEPAGE_950=m
++CONFIG_NLS_CODEPAGE_932=m
++CONFIG_NLS_CODEPAGE_949=m
++CONFIG_NLS_CODEPAGE_874=m
++CONFIG_NLS_ISO8859_8=m
++CONFIG_NLS_CODEPAGE_1250=m
++CONFIG_NLS_CODEPAGE_1251=m
++CONFIG_NLS_ASCII=y
++CONFIG_NLS_ISO8859_1=y
++CONFIG_NLS_ISO8859_2=m
++CONFIG_NLS_ISO8859_3=m
++CONFIG_NLS_ISO8859_4=m
++CONFIG_NLS_ISO8859_5=m
++CONFIG_NLS_ISO8859_6=m
++CONFIG_NLS_ISO8859_7=m
++CONFIG_NLS_ISO8859_9=m
++CONFIG_NLS_ISO8859_13=m
++CONFIG_NLS_ISO8859_14=m
++CONFIG_NLS_ISO8859_15=m
++CONFIG_NLS_KOI8_R=m
++CONFIG_NLS_KOI8_U=m
++# CONFIG_NLS_MAC_ROMAN is not set
++# CONFIG_NLS_MAC_CELTIC is not set
++# CONFIG_NLS_MAC_CENTEURO is not set
++# CONFIG_NLS_MAC_CROATIAN is not set
++# CONFIG_NLS_MAC_CYRILLIC is not set
++# CONFIG_NLS_MAC_GAELIC is not set
++# CONFIG_NLS_MAC_GREEK is not set
++# CONFIG_NLS_MAC_ICELAND is not set
++# CONFIG_NLS_MAC_INUIT is not set
++# CONFIG_NLS_MAC_ROMANIAN is not set
++# CONFIG_NLS_MAC_TURKISH is not set
++CONFIG_NLS_UTF8=y
++# CONFIG_DLM is not set
++
++#
++# Security options
++#
++CONFIG_KEYS=y
++CONFIG_KEYS_COMPAT=y
++# CONFIG_PERSISTENT_KEYRINGS is not set
++# CONFIG_BIG_KEYS is not set
++# CONFIG_ENCRYPTED_KEYS is not set
++# CONFIG_KEY_DH_OPERATIONS is not set
++# CONFIG_SECURITY_DMESG_RESTRICT is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITYFS is not set
++CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
++# CONFIG_HARDENED_USERCOPY is not set
++# CONFIG_FORTIFY_SOURCE is not set
++# CONFIG_STATIC_USERMODEHELPER is not set
++CONFIG_DEFAULT_SECURITY_DAC=y
++CONFIG_DEFAULT_SECURITY=""
++CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_ALGAPI2=y
++CONFIG_CRYPTO_AEAD=m
++CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_BLKCIPHER2=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_HASH2=y
++CONFIG_CRYPTO_RNG=m
++CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_RNG_DEFAULT=m
++CONFIG_CRYPTO_AKCIPHER2=y
++CONFIG_CRYPTO_AKCIPHER=y
++CONFIG_CRYPTO_KPP2=y
++CONFIG_CRYPTO_ACOMP2=y
++CONFIG_CRYPTO_RSA=y
++# CONFIG_CRYPTO_DH is not set
++# CONFIG_CRYPTO_ECDH is not set
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_MANAGER2=y
++# CONFIG_CRYPTO_USER is not set
++CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_NULL=m
++CONFIG_CRYPTO_NULL2=y
++# CONFIG_CRYPTO_PCRYPT is not set
++CONFIG_CRYPTO_WORKQUEUE=y
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_MCRYPTD is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++CONFIG_CRYPTO_CCM=m
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_CHACHA20POLY1305 is not set
++# CONFIG_CRYPTO_AEGIS128 is not set
++# CONFIG_CRYPTO_AEGIS128L is not set
++# CONFIG_CRYPTO_AEGIS256 is not set
++# CONFIG_CRYPTO_MORUS640 is not set
++# CONFIG_CRYPTO_MORUS1280 is not set
++CONFIG_CRYPTO_SEQIV=m
++CONFIG_CRYPTO_ECHAINIV=m
++
++#
++# Block modes
++#
++# CONFIG_CRYPTO_CBC is not set
++# CONFIG_CRYPTO_CFB is not set
++CONFIG_CRYPTO_CTR=m
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=y
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_KEYWRAP is not set
++
++#
++# Hash modes
++#
++CONFIG_CRYPTO_CMAC=y
++CONFIG_CRYPTO_HMAC=m
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_VMAC is not set
++
++#
++# Digest
++#
++CONFIG_CRYPTO_CRC32C=y
++# CONFIG_CRYPTO_CRC32 is not set
++# CONFIG_CRYPTO_CRCT10DIF is not set
++# CONFIG_CRYPTO_GHASH is not set
++# CONFIG_CRYPTO_POLY1305 is not set
++# CONFIG_CRYPTO_MD4 is not set
++# CONFIG_CRYPTO_MD5 is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_RMD128 is not set
++# CONFIG_CRYPTO_RMD160 is not set
++# CONFIG_CRYPTO_RMD256 is not set
++# CONFIG_CRYPTO_RMD320 is not set
++# CONFIG_CRYPTO_SHA1 is not set
++CONFIG_CRYPTO_SHA256=y
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_SHA3 is not set
++# CONFIG_CRYPTO_SM3 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_WP512 is not set
++
++#
++# Ciphers
++#
++CONFIG_CRYPTO_AES=y
++# CONFIG_CRYPTO_AES_TI is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++CONFIG_CRYPTO_ARC4=y
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_DES is not set
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_CHACHA20 is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_SM4 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++
++#
++# Compression
++#
++CONFIG_CRYPTO_DEFLATE=y
++CONFIG_CRYPTO_LZO=y
++# CONFIG_CRYPTO_842 is not set
++# CONFIG_CRYPTO_LZ4 is not set
++# CONFIG_CRYPTO_LZ4HC is not set
++# CONFIG_CRYPTO_ZSTD is not set
++
++#
++# Random Number Generation
++#
++# CONFIG_CRYPTO_ANSI_CPRNG is not set
++CONFIG_CRYPTO_DRBG_MENU=m
++CONFIG_CRYPTO_DRBG_HMAC=y
++# CONFIG_CRYPTO_DRBG_HASH is not set
++# CONFIG_CRYPTO_DRBG_CTR is not set
++CONFIG_CRYPTO_DRBG=m
++CONFIG_CRYPTO_JITTERENTROPY=m
++# CONFIG_CRYPTO_USER_API_HASH is not set
++# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
++# CONFIG_CRYPTO_USER_API_RNG is not set
++# CONFIG_CRYPTO_USER_API_AEAD is not set
++CONFIG_CRYPTO_HASH_INFO=y
++CONFIG_CRYPTO_HW=y
++# CONFIG_CRYPTO_DEV_CCP is not set
++# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set
++# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set
++# CONFIG_CRYPTO_DEV_CCREE is not set
++# CONFIG_CRYPTO_DEV_HISI_SEC is not set
++CONFIG_ASYMMETRIC_KEY_TYPE=y
++CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
++CONFIG_X509_CERTIFICATE_PARSER=y
++CONFIG_PKCS7_MESSAGE_PARSER=y
++# CONFIG_PKCS7_TEST_KEY is not set
++# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set
++
++#
++# Certificates for signature checking
++#
++CONFIG_SYSTEM_TRUSTED_KEYRING=y
++CONFIG_SYSTEM_TRUSTED_KEYS=""
++# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set
++# CONFIG_SECONDARY_TRUSTED_KEYRING is not set
++# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_HAVE_ARCH_BITREVERSE=y
++CONFIG_RATIONAL=y
++CONFIG_GENERIC_STRNCPY_FROM_USER=y
++CONFIG_GENERIC_STRNLEN_USER=y
++CONFIG_GENERIC_NET_UTILS=y
++CONFIG_GENERIC_PCI_IOMAP=y
++CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
++CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
++# CONFIG_INDIRECT_PIO is not set
++CONFIG_CRC_CCITT=y
++CONFIG_CRC16=y
++# CONFIG_CRC_T10DIF is not set
++CONFIG_CRC_ITU_T=y
++CONFIG_CRC32=y
++# CONFIG_CRC32_SELFTEST is not set
++CONFIG_CRC32_SLICEBY8=y
++# CONFIG_CRC32_SLICEBY4 is not set
++# CONFIG_CRC32_SARWATE is not set
++# CONFIG_CRC32_BIT is not set
++# CONFIG_CRC64 is not set
++# CONFIG_CRC4 is not set
++# CONFIG_CRC7 is not set
++CONFIG_LIBCRC32C=y
++# CONFIG_CRC8 is not set
++CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
++# CONFIG_RANDOM32_SELFTEST is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_LZO_COMPRESS=y
++CONFIG_LZO_DECOMPRESS=y
++CONFIG_XZ_DEC=y
++CONFIG_XZ_DEC_X86=y
++CONFIG_XZ_DEC_POWERPC=y
++CONFIG_XZ_DEC_IA64=y
++CONFIG_XZ_DEC_ARM=y
++CONFIG_XZ_DEC_ARMTHUMB=y
++CONFIG_XZ_DEC_SPARC=y
++CONFIG_XZ_DEC_BCJ=y
++# CONFIG_XZ_DEC_TEST is not set
++CONFIG_GENERIC_ALLOCATOR=y
++CONFIG_ASSOCIATIVE_ARRAY=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT_MAP=y
++CONFIG_HAS_DMA=y
++CONFIG_NEED_SG_DMA_LENGTH=y
++CONFIG_NEED_DMA_MAP_STATE=y
++CONFIG_ARCH_DMA_ADDR_T_64BIT=y
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_DMA_DIRECT_OPS=y
++CONFIG_SWIOTLB=y
++CONFIG_SGL_ALLOC=y
++CONFIG_CPU_RMAP=y
++CONFIG_DQL=y
++CONFIG_NLATTR=y
++CONFIG_CLZ_TAB=y
++# CONFIG_CORDIC is not set
++# CONFIG_DDR is not set
++# CONFIG_IRQ_POLL is not set
++CONFIG_MPILIB=y
++CONFIG_LIBFDT=y
++CONFIG_OID_REGISTRY=y
++CONFIG_SG_POOL=y
++CONFIG_ARCH_HAS_SG_CHAIN=y
++CONFIG_SBITMAP=y
++# CONFIG_STRING_SELFTEST is not set
++
++#
++# Kernel hacking
++#
++
++#
++# printk and dmesg options
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
++CONFIG_CONSOLE_LOGLEVEL_QUIET=4
++CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_DYNAMIC_DEBUG is not set
++
++#
++# Compile-time checks and compiler options
++#
++# CONFIG_DEBUG_INFO is not set
++CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=2048
++# CONFIG_STRIP_ASM_SYMS is not set
++# CONFIG_READABLE_ASM is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_PAGE_OWNER is not set
++CONFIG_DEBUG_FS=y
++# CONFIG_HEADERS_CHECK is not set
++# CONFIG_DEBUG_SECTION_MISMATCH is not set
++CONFIG_SECTION_MISMATCH_WARN_ONLY=y
++CONFIG_ARCH_WANT_FRAME_POINTERS=y
++CONFIG_FRAME_POINTER=y
++# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
++CONFIG_MAGIC_SYSRQ=y
++CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
++CONFIG_MAGIC_SYSRQ_SERIAL=y
++CONFIG_DEBUG_KERNEL=y
++
++#
++# Memory Debugging
++#
++# CONFIG_PAGE_EXTENSION is not set
++# CONFIG_DEBUG_PAGEALLOC is not set
++# CONFIG_PAGE_POISONING is not set
++# CONFIG_DEBUG_RODATA_TEST is not set
++# CONFIG_DEBUG_OBJECTS is not set
++# CONFIG_SLUB_DEBUG_ON is not set
++# CONFIG_SLUB_STATS is not set
++CONFIG_HAVE_DEBUG_KMEMLEAK=y
++# CONFIG_DEBUG_KMEMLEAK is not set
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_VM is not set
++CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
++# CONFIG_DEBUG_VIRTUAL is not set
++# CONFIG_DEBUG_MEMORY_INIT is not set
++# CONFIG_DEBUG_PER_CPU_MAPS is not set
++CONFIG_HAVE_ARCH_KASAN=y
++# CONFIG_KASAN is not set
++CONFIG_ARCH_HAS_KCOV=y
++CONFIG_CC_HAS_SANCOV_TRACE_PC=y
++# CONFIG_KCOV is not set
++# CONFIG_DEBUG_SHIRQ is not set
++
++#
++# Debug Lockups and Hangs
++#
++# CONFIG_SOFTLOCKUP_DETECTOR is not set
++CONFIG_DETECT_HUNG_TASK=y
++CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
++# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
++# CONFIG_WQ_WATCHDOG is not set
++CONFIG_PANIC_ON_OOPS=y
++CONFIG_PANIC_ON_OOPS_VALUE=1
++CONFIG_PANIC_TIMEOUT=1
++CONFIG_SCHED_DEBUG=y
++CONFIG_SCHED_INFO=y
++CONFIG_SCHEDSTATS=y
++# CONFIG_SCHED_STACK_END_CHECK is not set
++# CONFIG_DEBUG_TIMEKEEPING is not set
++
++#
++# Lock Debugging (spinlocks, mutexes, etc...)
++#
++CONFIG_LOCK_DEBUGGING_SUPPORT=y
++# CONFIG_PROVE_LOCKING is not set
++# CONFIG_LOCK_STAT is not set
++# CONFIG_DEBUG_RT_MUTEXES is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++# CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
++# CONFIG_DEBUG_RWSEMS is not set
++# CONFIG_DEBUG_LOCK_ALLOC is not set
++# CONFIG_DEBUG_ATOMIC_SLEEP is not set
++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++# CONFIG_LOCK_TORTURE_TEST is not set
++# CONFIG_WW_MUTEX_SELFTEST is not set
++CONFIG_STACKTRACE=y
++# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set
++# CONFIG_DEBUG_KOBJECT is not set
++CONFIG_HAVE_DEBUG_BUGVERBOSE=y
++CONFIG_DEBUG_BUGVERBOSE=y
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_PI_LIST is not set
++# CONFIG_DEBUG_SG is not set
++# CONFIG_DEBUG_NOTIFIERS is not set
++# CONFIG_DEBUG_CREDENTIALS is not set
++
++#
++# RCU Debugging
++#
++# CONFIG_RCU_PERF_TEST is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++CONFIG_RCU_CPU_STALL_TIMEOUT=60
++CONFIG_RCU_TRACE=y
++# CONFIG_RCU_EQS_DEBUG is not set
++# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
++# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
++# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
++# CONFIG_NOTIFIER_ERROR_INJECTION is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_LATENCYTOP is not set
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
++CONFIG_HAVE_C_RECORDMCOUNT=y
++CONFIG_TRACE_CLOCK=y
++CONFIG_TRACING_SUPPORT=y
++# CONFIG_FTRACE is not set
++# CONFIG_DMA_API_DEBUG is not set
++CONFIG_RUNTIME_TESTING_MENU=y
++# CONFIG_LKDTM is not set
++# CONFIG_TEST_LIST_SORT is not set
++# CONFIG_TEST_SORT is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
++# CONFIG_RBTREE_TEST is not set
++# CONFIG_INTERVAL_TREE_TEST is not set
++# CONFIG_PERCPU_TEST is not set
++# CONFIG_ATOMIC64_SELFTEST is not set
++# CONFIG_TEST_HEXDUMP is not set
++# CONFIG_TEST_STRING_HELPERS is not set
++# CONFIG_TEST_KSTRTOX is not set
++# CONFIG_TEST_PRINTF is not set
++# CONFIG_TEST_BITMAP is not set
++# CONFIG_TEST_BITFIELD is not set
++# CONFIG_TEST_UUID is not set
++# CONFIG_TEST_OVERFLOW is not set
++# CONFIG_TEST_RHASHTABLE is not set
++# CONFIG_TEST_HASH is not set
++# CONFIG_TEST_IDA is not set
++# CONFIG_TEST_LKM is not set
++# CONFIG_TEST_USER_COPY is not set
++# CONFIG_TEST_BPF is not set
++# CONFIG_FIND_BIT_BENCHMARK is not set
++# CONFIG_TEST_FIRMWARE is not set
++# CONFIG_TEST_SYSCTL is not set
++# CONFIG_TEST_UDELAY is not set
++# CONFIG_TEST_STATIC_KEYS is not set
++# CONFIG_TEST_KMOD is not set
++# CONFIG_MEMTEST is not set
++# CONFIG_BUG_ON_DATA_CORRUPTION is not set
++# CONFIG_SAMPLES is not set
++CONFIG_HAVE_ARCH_KGDB=y
++# CONFIG_KGDB is not set
++CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
++# CONFIG_UBSAN is not set
++CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
++# CONFIG_STRICT_DEVMEM is not set
++# CONFIG_ARM64_PTDUMP_DEBUGFS is not set
++# CONFIG_PID_IN_CONTEXTIDR is not set
++# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
++# CONFIG_DEBUG_WX is not set
++# CONFIG_DEBUG_ALIGN_RODATA is not set
++# CONFIG_ARM64_RELOC_TEST is not set
++# CONFIG_CORESIGHT is not set
+diff --git a/arch/arm64/configs/ss928v100_nand_defconfig b/arch/arm64/configs/ss928v100_nand_defconfig
+new file mode 100644
+index 000000000000..30d5aa8374d1
+--- /dev/null
++++ b/arch/arm64/configs/ss928v100_nand_defconfig
+@@ -0,0 +1,3669 @@
++#
++# Automatically generated file; DO NOT EDIT.
++# Linux/arm64 4.19.90 Kernel Configuration
++#
++
++#
++# Compiler: aarch64-mix210-linux-gcc (HC&C V1R3C00SPC200B042_20221123) 7.3.0
++#
++CONFIG_CC_IS_GCC=y
++CONFIG_GCC_VERSION=70300
++CONFIG_CLANG_VERSION=0
++CONFIG_CC_HAS_ASM_GOTO=y
++CONFIG_IRQ_WORK=y
++CONFIG_BUILDTIME_EXTABLE_SORT=y
++CONFIG_THREAD_INFO_IN_TASK=y
++
++#
++# General setup
++#
++CONFIG_INIT_ENV_ARG_LIMIT=32
++# CONFIG_COMPILE_TEST is not set
++CONFIG_LOCALVERSION=""
++# CONFIG_LOCALVERSION_AUTO is not set
++CONFIG_BUILD_SALT=""
++CONFIG_DEFAULT_HOSTNAME="(none)"
++# CONFIG_SWAP is not set
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++CONFIG_CROSS_MEMORY_ATTACH=y
++CONFIG_USELIB=y
++# CONFIG_AUDIT is not set
++CONFIG_HAVE_ARCH_AUDITSYSCALL=y
++
++#
++# IRQ subsystem
++#
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
++CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
++CONFIG_GENERIC_IRQ_MIGRATION=y
++CONFIG_HARDIRQS_SW_RESEND=y
++CONFIG_IRQ_DOMAIN=y
++CONFIG_IRQ_DOMAIN_HIERARCHY=y
++CONFIG_GENERIC_MSI_IRQ=y
++CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
++CONFIG_HANDLE_DOMAIN_IRQ=y
++CONFIG_IRQ_FORCED_THREADING=y
++CONFIG_SPARSE_IRQ=y
++CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
++CONFIG_ARCH_CLOCKSOURCE_DATA=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_ARCH_HAS_TICK_BROADCAST=y
++CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
++
++#
++# Timers subsystem
++#
++CONFIG_HZ_PERIODIC=y
++# CONFIG_NO_HZ_IDLE is not set
++# CONFIG_NO_HZ_FULL is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_PREEMPT_NONE=y
++# CONFIG_PREEMPT_VOLUNTARY is not set
++# CONFIG_PREEMPT is not set
++
++#
++# CPU/Task time and stats accounting
++#
++CONFIG_TICK_CPU_ACCOUNTING=y
++# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
++# CONFIG_IRQ_TIME_ACCOUNTING is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++CONFIG_CPU_ISOLATION=y
++
++#
++# RCU Subsystem
++#
++CONFIG_TREE_RCU=y
++# CONFIG_RCU_EXPERT is not set
++CONFIG_SRCU=y
++CONFIG_TREE_SRCU=y
++CONFIG_RCU_STALL_COMMON=y
++CONFIG_RCU_NEED_SEGCBLIST=y
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
++CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
++CONFIG_GENERIC_SCHED_CLOCK=y
++CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
++CONFIG_ARCH_SUPPORTS_INT128=y
++# CONFIG_CGROUPS is not set
++CONFIG_NAMESPACES=y
++CONFIG_UTS_NS=y
++CONFIG_IPC_NS=y
++# CONFIG_USER_NS is not set
++CONFIG_PID_NS=y
++CONFIG_NET_NS=y
++# CONFIG_CHECKPOINT_RESTORE is not set
++# CONFIG_SCHED_AUTOGROUP is not set
++# CONFIG_SYSFS_DEPRECATED is not set
++CONFIG_RELAY=y
++# CONFIG_BLK_DEV_INITRD is not set
++CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_ANON_INODES=y
++CONFIG_HAVE_UID16=y
++CONFIG_SYSCTL_EXCEPTION_TRACE=y
++CONFIG_BPF=y
++CONFIG_EXPERT=y
++CONFIG_UID16=y
++CONFIG_MULTIUSER=y
++# CONFIG_SGETMASK_SYSCALL is not set
++CONFIG_SYSFS_SYSCALL=y
++# CONFIG_SYSCTL_SYSCALL is not set
++# CONFIG_FHANDLE is not set
++CONFIG_POSIX_TIMERS=y
++CONFIG_PRINTK=y
++CONFIG_PRINTK_NMI=y
++CONFIG_BUG=y
++CONFIG_ELF_CORE=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_FUTEX_PI=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_AIO=y
++CONFIG_ADVISE_SYSCALLS=y
++CONFIG_MEMBARRIER=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++CONFIG_KALLSYMS_BASE_RELATIVE=y
++CONFIG_BPF_SYSCALL=y
++CONFIG_USERFAULTFD=y
++CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
++CONFIG_RSEQ=y
++# CONFIG_DEBUG_RSEQ is not set
++CONFIG_EMBEDDED=y
++CONFIG_HAVE_PERF_EVENTS=y
++# CONFIG_PC104 is not set
++
++#
++# Kernel Performance Events And Counters
++#
++# CONFIG_PERF_EVENTS is not set
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++# CONFIG_COMPAT_BRK is not set
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++CONFIG_SLAB_MERGE_DEFAULT=y
++# CONFIG_SLAB_FREELIST_RANDOM is not set
++# CONFIG_SLAB_FREELIST_HARDENED is not set
++CONFIG_SLUB_CPU_PARTIAL=y
++# CONFIG_PROFILING is not set
++CONFIG_ARM64=y
++CONFIG_64BIT=y
++CONFIG_MMU=y
++CONFIG_ARM64_PAGE_SHIFT=12
++CONFIG_ARM64_CONT_SHIFT=4
++CONFIG_ARCH_MMAP_RND_BITS_MIN=18
++CONFIG_ARCH_MMAP_RND_BITS_MAX=24
++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
++CONFIG_LOCKDEP_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_RWSEM_XCHGADD_ALGORITHM=y
++CONFIG_GENERIC_BUG=y
++CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CSUM=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_ZONE_DMA32=y
++CONFIG_HAVE_GENERIC_GUP=y
++CONFIG_SMP=y
++CONFIG_KERNEL_MODE_NEON=y
++CONFIG_FIX_EARLYCON_MEM=y
++CONFIG_PGTABLE_LEVELS=3
++CONFIG_ARCH_SUPPORTS_UPROBES=y
++CONFIG_ARCH_PROC_KCORE_TEXT=y
++
++#
++# Platform selection
++#
++# CONFIG_ARCH_ACTIONS is not set
++# CONFIG_ARCH_SUNXI is not set
++# CONFIG_ARCH_ALPINE is not set
++# CONFIG_ARCH_BCM2835 is not set
++# CONFIG_ARCH_BCM_IPROC is not set
++# CONFIG_ARCH_BERLIN is not set
++# CONFIG_ARCH_BRCMSTB is not set
++# CONFIG_ARCH_EXYNOS is not set
++# CONFIG_ARCH_K3 is not set
++# CONFIG_ARCH_LAYERSCAPE is not set
++# CONFIG_ARCH_LG1K is not set
++# CONFIG_ARCH_HISI is not set
++CONFIG_ARCH_BSP=y
++# CONFIG_ARCH_SS528V100 is not set
++# CONFIG_ARCH_SS625V100 is not set
++# CONFIG_ARCH_SS919V100 is not set
++# CONFIG_ARCH_SS015V100 is not set
++CONFIG_ARCH_SS928V100=y
++# CONFIG_ARCH_SS927V100 is not set
++# CONFIG_ARCH_MEDIATEK is not set
++# CONFIG_ARCH_MESON is not set
++# CONFIG_ARCH_MVEBU is not set
++# CONFIG_ARCH_QCOM is not set
++# CONFIG_ARCH_REALTEK is not set
++# CONFIG_ARCH_ROCKCHIP is not set
++# CONFIG_ARCH_SEATTLE is not set
++# CONFIG_ARCH_SYNQUACER is not set
++# CONFIG_ARCH_RENESAS is not set
++# CONFIG_ARCH_STRATIX10 is not set
++# CONFIG_ARCH_TEGRA is not set
++# CONFIG_ARCH_SPRD is not set
++# CONFIG_ARCH_THUNDER is not set
++# CONFIG_ARCH_THUNDER2 is not set
++# CONFIG_ARCH_UNIPHIER is not set
++# CONFIG_ARCH_VEXPRESS is not set
++# CONFIG_ARCH_XGENE is not set
++# CONFIG_ARCH_ZX is not set
++# CONFIG_ARCH_ZYNQMP is not set
++
++#
++# Bus support
++#
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_DOMAINS_GENERIC=y
++CONFIG_PCI_SYSCALL=y
++CONFIG_PCIEPORTBUS=y
++# CONFIG_PCIEAER is not set
++# CONFIG_PCIEASPM is not set
++CONFIG_PCIE_PME=y
++# CONFIG_PCIE_PTM is not set
++CONFIG_PCI_MSI=y
++CONFIG_PCI_MSI_IRQ_DOMAIN=y
++CONFIG_PCI_QUIRKS=y
++# CONFIG_PCI_DEBUG is not set
++# CONFIG_PCI_STUB is not set
++# CONFIG_PCI_IOV is not set
++# CONFIG_PCI_PRI is not set
++# CONFIG_PCI_PASID is not set
++# CONFIG_HOTPLUG_PCI is not set
++
++#
++# PCI controller drivers
++#
++
++#
++# Cadence PCIe controllers support
++#
++# CONFIG_PCIE_CADENCE_HOST is not set
++# CONFIG_PCI_FTPCI100 is not set
++# CONFIG_PCI_HOST_GENERIC is not set
++# CONFIG_PCIE_XILINX is not set
++# CONFIG_PCI_XGENE is not set
++# CONFIG_PCI_HOST_THUNDER_PEM is not set
++# CONFIG_PCI_HOST_THUNDER_ECAM is not set
++
++#
++# DesignWare PCI Core Support
++#
++# CONFIG_PCIE_DW_PLAT_HOST is not set
++# CONFIG_PCI_HISI is not set
++# CONFIG_PCIE_KIRIN is not set
++
++#
++# PCI Endpoint
++#
++# CONFIG_PCI_ENDPOINT is not set
++
++#
++# PCI switch controller drivers
++#
++# CONFIG_PCI_SW_SWITCHTEC is not set
++# CONFIG_BSP_PCIE is not set
++
++#
++# Kernel Features
++#
++
++#
++# ARM errata workarounds via the alternatives framework
++#
++CONFIG_ARM64_ERRATUM_826319=y
++CONFIG_ARM64_ERRATUM_827319=y
++CONFIG_ARM64_ERRATUM_824069=y
++CONFIG_ARM64_ERRATUM_819472=y
++CONFIG_ARM64_ERRATUM_832075=y
++CONFIG_ARM64_ERRATUM_845719=y
++CONFIG_ARM64_ERRATUM_843419=y
++CONFIG_ARM64_ERRATUM_1024718=y
++CONFIG_ARM64_ERRATUM_1463225=y
++CONFIG_CAVIUM_ERRATUM_22375=y
++CONFIG_CAVIUM_ERRATUM_23154=y
++CONFIG_CAVIUM_ERRATUM_27456=y
++CONFIG_CAVIUM_ERRATUM_30115=y
++CONFIG_QCOM_FALKOR_ERRATUM_1003=y
++CONFIG_QCOM_FALKOR_ERRATUM_1009=y
++CONFIG_QCOM_QDF2400_ERRATUM_0065=y
++CONFIG_SOCIONEXT_SYNQUACER_PREITS=y
++CONFIG_HISILICON_ERRATUM_161600802=y
++CONFIG_QCOM_FALKOR_ERRATUM_E1041=y
++CONFIG_ARM64_4K_PAGES=y
++# CONFIG_ARM64_16K_PAGES is not set
++# CONFIG_ARM64_64K_PAGES is not set
++CONFIG_ARM64_VA_BITS_39=y
++# CONFIG_ARM64_VA_BITS_48 is not set
++CONFIG_ARM64_VA_BITS=39
++CONFIG_ARM64_PA_BITS_48=y
++CONFIG_ARM64_PA_BITS=48
++# CONFIG_CPU_BIG_ENDIAN is not set
++CONFIG_SCHED_MC=y
++# CONFIG_SCHED_SMT is not set
++CONFIG_NR_CPUS=4
++CONFIG_HOTPLUG_CPU=y
++# CONFIG_NUMA is not set
++CONFIG_HOLES_IN_ZONE=y
++CONFIG_HZ_100=y
++# CONFIG_HZ_250 is not set
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=100
++CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
++CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y
++CONFIG_ARCH_SPARSEMEM_ENABLE=y
++CONFIG_ARCH_SPARSEMEM_DEFAULT=y
++CONFIG_ARCH_SELECT_MEMORY_MODEL=y
++CONFIG_ARCH_FLATMEM_ENABLE=y
++CONFIG_HAVE_ARCH_PFN_VALID=y
++CONFIG_SYS_SUPPORTS_HUGETLBFS=y
++CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
++CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
++# CONFIG_SECCOMP is not set
++# CONFIG_PARAVIRT is not set
++# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
++# CONFIG_KEXEC is not set
++# CONFIG_CRASH_DUMP is not set
++# CONFIG_XEN is not set
++CONFIG_FORCE_MAX_ZONEORDER=11
++CONFIG_UNMAP_KERNEL_AT_EL0=y
++CONFIG_HARDEN_BRANCH_PREDICTOR=y
++CONFIG_HARDEN_EL2_VECTORS=y
++CONFIG_ARM64_SSBD=y
++# CONFIG_ARMV8_DEPRECATED is not set
++# CONFIG_ARM64_SW_TTBR0_PAN is not set
++
++#
++# ARMv8.1 architectural features
++#
++CONFIG_ARM64_HW_AFDBM=y
++CONFIG_ARM64_PAN=y
++# CONFIG_ARM64_LSE_ATOMICS is not set
++CONFIG_ARM64_VHE=y
++
++#
++# ARMv8.2 architectural features
++#
++CONFIG_ARM64_UAO=y
++# CONFIG_ARM64_PMEM is not set
++CONFIG_ARM64_RAS_EXTN=y
++CONFIG_ARM64_SVE=y
++CONFIG_ARM64_MODULE_PLTS=y
++# CONFIG_RANDOMIZE_BASE is not set
++
++#
++# Boot options
++#
++CONFIG_CMDLINE="mem=128M console=ttyAMA0,115200 console=ttyMTD,blackbox"
++# CONFIG_CMDLINE_FORCE is not set
++# CONFIG_EFI is not set
++CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y
++CONFIG_IMG_GZ_DTB=y
++# CONFIG_IMG_DTB is not set
++CONFIG_BUILD_ARM64_APPENDED_KERNEL_IMAGE_NAME="Image.gz-dtb"
++CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES="vendor/ss928v100-demb-flash"
++CONFIG_COMPAT=y
++CONFIG_SYSVIPC_COMPAT=y
++
++#
++# Power management options
++#
++CONFIG_SUSPEND=y
++CONFIG_SUSPEND_FREEZER=y
++# CONFIG_SUSPEND_SKIP_SYNC is not set
++CONFIG_PM_SLEEP=y
++CONFIG_PM_SLEEP_SMP=y
++# CONFIG_PM_AUTOSLEEP is not set
++# CONFIG_PM_WAKELOCKS is not set
++CONFIG_PM=y
++# CONFIG_PM_DEBUG is not set
++CONFIG_PM_CLK=y
++# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
++CONFIG_CPU_PM=y
++CONFIG_ARCH_HIBERNATION_POSSIBLE=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++
++#
++# CPU Power Management
++#
++
++#
++# CPU Idle
++#
++# CONFIG_CPU_IDLE is not set
++
++#
++# CPU Frequency scaling
++#
++CONFIG_CPU_FREQ=y
++CONFIG_CPU_FREQ_GOV_ATTR_SET=y
++CONFIG_CPU_FREQ_GOV_COMMON=y
++CONFIG_CPU_FREQ_STAT=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
++CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
++CONFIG_CPU_FREQ_GOV_POWERSAVE=y
++CONFIG_CPU_FREQ_GOV_USERSPACE=y
++CONFIG_CPU_FREQ_GOV_ONDEMAND=y
++CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
++# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set
++
++#
++# CPU frequency scaling drivers
++#
++CONFIG_CPUFREQ_DT=y
++CONFIG_CPUFREQ_DT_PLATDEV=y
++# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set
++# CONFIG_QORIQ_CPUFREQ is not set
++
++#
++# Firmware Drivers
++#
++CONFIG_ARM_PSCI_FW=y
++# CONFIG_ARM_SDE_INTERFACE is not set
++# CONFIG_FIRMWARE_MEMMAP is not set
++# CONFIG_FW_CFG_SYSFS is not set
++CONFIG_HAVE_ARM_SMCCC=y
++# CONFIG_GOOGLE_FIRMWARE is not set
++
++#
++# Tegra firmware driver
++#
++# CONFIG_VIRTUALIZATION is not set
++# CONFIG_ARM64_CRYPTO is not set
++
++#
++# General architecture-dependent options
++#
++# CONFIG_KPROBES is not set
++# CONFIG_JUMP_LABEL is not set
++CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_HAVE_NMI=y
++CONFIG_HAVE_ARCH_TRACEHOOK=y
++CONFIG_HAVE_DMA_CONTIGUOUS=y
++CONFIG_GENERIC_SMP_IDLE_THREAD=y
++CONFIG_GENERIC_IDLE_POLL_SETUP=y
++CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
++CONFIG_ARCH_HAS_SET_MEMORY=y
++CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
++CONFIG_HAVE_RSEQ=y
++CONFIG_HAVE_CLK=y
++CONFIG_HAVE_PERF_REGS=y
++CONFIG_HAVE_PERF_USER_STACK_DUMP=y
++CONFIG_HAVE_ARCH_JUMP_LABEL=y
++CONFIG_HAVE_RCU_TABLE_FREE=y
++CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
++CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
++CONFIG_HAVE_CMPXCHG_LOCAL=y
++CONFIG_HAVE_CMPXCHG_DOUBLE=y
++CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
++CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
++CONFIG_HAVE_STACKPROTECTOR=y
++CONFIG_CC_HAS_STACKPROTECTOR_NONE=y
++CONFIG_STACKPROTECTOR=y
++CONFIG_STACKPROTECTOR_STRONG=y
++CONFIG_HAVE_CONTEXT_TRACKING=y
++CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
++CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
++CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
++CONFIG_HAVE_ARCH_HUGE_VMAP=y
++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
++CONFIG_MODULES_USE_ELF_RELA=y
++CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
++CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
++CONFIG_ARCH_MMAP_RND_BITS=18
++CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y
++CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11
++CONFIG_CLONE_BACKWARDS=y
++CONFIG_OLD_SIGSUSPEND3=y
++CONFIG_COMPAT_OLD_SIGACTION=y
++CONFIG_COMPAT_32BIT_TIME=y
++CONFIG_HAVE_ARCH_VMAP_STACK=y
++CONFIG_VMAP_STACK=y
++CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
++CONFIG_STRICT_KERNEL_RWX=y
++CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
++CONFIG_STRICT_MODULE_RWX=y
++CONFIG_REFCOUNT_FULL=y
++CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y
++
++#
++# GCOV-based kernel profiling
++#
++CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
++CONFIG_PLUGIN_HOSTCC=""
++CONFIG_HAVE_GCC_PLUGINS=y
++CONFIG_RT_MUTEXES=y
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_FORCE_LOAD=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++# CONFIG_MODULE_SIG is not set
++# CONFIG_MODULE_COMPRESS is not set
++# CONFIG_TRIM_UNUSED_KSYMS is not set
++CONFIG_BLOCK=y
++CONFIG_BLK_SCSI_REQUEST=y
++CONFIG_BLK_DEV_BSG=y
++# CONFIG_BLK_DEV_BSGLIB is not set
++# CONFIG_BLK_DEV_INTEGRITY is not set
++# CONFIG_BLK_DEV_ZONED is not set
++CONFIG_BLK_CMDLINE_PARSER=y
++# CONFIG_BLK_WBT is not set
++# CONFIG_BLK_SED_OPAL is not set
++
++#
++# Partition Types
++#
++CONFIG_PARTITION_ADVANCED=y
++# CONFIG_ACORN_PARTITION is not set
++# CONFIG_AIX_PARTITION is not set
++# CONFIG_OSF_PARTITION is not set
++# CONFIG_AMIGA_PARTITION is not set
++# CONFIG_ATARI_PARTITION is not set
++# CONFIG_MAC_PARTITION is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_BSD_DISKLABEL is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# CONFIG_UNIXWARE_DISKLABEL is not set
++# CONFIG_LDM_PARTITION is not set
++# CONFIG_SGI_PARTITION is not set
++# CONFIG_ULTRIX_PARTITION is not set
++# CONFIG_SUN_PARTITION is not set
++# CONFIG_KARMA_PARTITION is not set
++CONFIG_EFI_PARTITION=y
++# CONFIG_SYSV68_PARTITION is not set
++CONFIG_CMDLINE_PARTITION=y
++CONFIG_BLOCK_COMPAT=y
++CONFIG_BLK_MQ_PCI=y
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_DEADLINE=y
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="deadline"
++CONFIG_MQ_IOSCHED_DEADLINE=y
++CONFIG_MQ_IOSCHED_KYBER=y
++# CONFIG_IOSCHED_BFQ is not set
++CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y
++CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_LOCK=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_INLINE_READ_LOCK=y
++CONFIG_ARCH_INLINE_READ_LOCK_BH=y
++CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_READ_UNLOCK=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_INLINE_WRITE_LOCK=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y
++CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y
++CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_SPIN_TRYLOCK=y
++CONFIG_INLINE_SPIN_TRYLOCK_BH=y
++CONFIG_INLINE_SPIN_LOCK=y
++CONFIG_INLINE_SPIN_LOCK_BH=y
++CONFIG_INLINE_SPIN_LOCK_IRQ=y
++CONFIG_INLINE_SPIN_LOCK_IRQSAVE=y
++CONFIG_INLINE_SPIN_UNLOCK_BH=y
++CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
++CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_READ_LOCK=y
++CONFIG_INLINE_READ_LOCK_BH=y
++CONFIG_INLINE_READ_LOCK_IRQ=y
++CONFIG_INLINE_READ_LOCK_IRQSAVE=y
++CONFIG_INLINE_READ_UNLOCK=y
++CONFIG_INLINE_READ_UNLOCK_BH=y
++CONFIG_INLINE_READ_UNLOCK_IRQ=y
++CONFIG_INLINE_READ_UNLOCK_IRQRESTORE=y
++CONFIG_INLINE_WRITE_LOCK=y
++CONFIG_INLINE_WRITE_LOCK_BH=y
++CONFIG_INLINE_WRITE_LOCK_IRQ=y
++CONFIG_INLINE_WRITE_LOCK_IRQSAVE=y
++CONFIG_INLINE_WRITE_UNLOCK=y
++CONFIG_INLINE_WRITE_UNLOCK_BH=y
++CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
++CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE=y
++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
++CONFIG_MUTEX_SPIN_ON_OWNER=y
++CONFIG_RWSEM_SPIN_ON_OWNER=y
++CONFIG_LOCK_SPIN_ON_OWNER=y
++CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
++CONFIG_QUEUED_SPINLOCKS=y
++CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
++CONFIG_QUEUED_RWLOCKS=y
++CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y
++CONFIG_FREEZER=y
++
++#
++# Executable file formats
++#
++CONFIG_BINFMT_ELF=y
++CONFIG_COMPAT_BINFMT_ELF=y
++CONFIG_ELFCORE=y
++CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
++CONFIG_BINFMT_SCRIPT=y
++# CONFIG_BINFMT_MISC is not set
++CONFIG_COREDUMP=y
++
++#
++# Memory Management options
++#
++CONFIG_SELECT_MEMORY_MODEL=y
++# CONFIG_FLATMEM_MANUAL is not set
++CONFIG_SPARSEMEM_MANUAL=y
++CONFIG_SPARSEMEM=y
++CONFIG_HAVE_MEMORY_PRESENT=y
++CONFIG_SPARSEMEM_EXTREME=y
++CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
++CONFIG_SPARSEMEM_VMEMMAP=y
++CONFIG_HAVE_MEMBLOCK=y
++CONFIG_NO_BOOTMEM=y
++CONFIG_MEMORY_ISOLATION=y
++CONFIG_SPLIT_PTLOCK_CPUS=4
++CONFIG_COMPACTION=y
++CONFIG_MIGRATION=y
++CONFIG_PHYS_ADDR_T_64BIT=y
++CONFIG_MMU_NOTIFIER=y
++CONFIG_KSM=y
++CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
++CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
++# CONFIG_MEMORY_FAILURE is not set
++# CONFIG_TRANSPARENT_HUGEPAGE is not set
++# CONFIG_CLEANCACHE is not set
++CONFIG_CMA=y
++# CONFIG_CMA_DEBUG is not set
++CONFIG_CMA_AREAS=7
++# CONFIG_ZPOOL is not set
++# CONFIG_ZBUD is not set
++# CONFIG_ZSMALLOC is not set
++CONFIG_GENERIC_EARLY_IOREMAP=y
++# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
++# CONFIG_IDLE_PAGE_TRACKING is not set
++CONFIG_FRAME_VECTOR=y
++# CONFIG_PERCPU_STATS is not set
++# CONFIG_GUP_BENCHMARK is not set
++CONFIG_ARCH_HAS_PTE_SPECIAL=y
++CONFIG_NET=y
++CONFIG_NET_INGRESS=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_DIAG is not set
++CONFIG_UNIX=y
++# CONFIG_UNIX_DIAG is not set
++# CONFIG_TLS is not set
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# CONFIG_XFRM_INTERFACE is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
++# CONFIG_NET_KEY is not set
++# CONFIG_XDP_SOCKETS is not set
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=y
++# CONFIG_IP_ADVANCED_ROUTER is not set
++# CONFIG_IP_PNP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE_DEMUX is not set
++CONFIG_NET_IP_TUNNEL=m
++# CONFIG_IP_MROUTE is not set
++# CONFIG_SYN_COOKIES is not set
++# CONFIG_NET_IPVTI is not set
++# CONFIG_NET_FOU is not set
++# CONFIG_NET_FOU_IP_TUNNELS is not set
++# CONFIG_INET_AH is not set
++# CONFIG_INET_ESP is not set
++# CONFIG_INET_IPCOMP is not set
++CONFIG_INET_TUNNEL=m
++CONFIG_INET_XFRM_MODE_TRANSPORT=y
++CONFIG_INET_XFRM_MODE_TUNNEL=y
++CONFIG_INET_XFRM_MODE_BEET=y
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_INET_UDP_DIAG is not set
++# CONFIG_INET_RAW_DIAG is not set
++# CONFIG_INET_DIAG_DESTROY is not set
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++CONFIG_IPV6=y
++CONFIG_IPV6_ROUTER_PREF=y
++# CONFIG_IPV6_ROUTE_INFO is not set
++# CONFIG_IPV6_OPTIMISTIC_DAD is not set
++# CONFIG_INET6_AH is not set
++# CONFIG_INET6_ESP is not set
++# CONFIG_INET6_IPCOMP is not set
++# CONFIG_IPV6_MIP6 is not set
++# CONFIG_IPV6_ILA is not set
++CONFIG_INET6_XFRM_MODE_TRANSPORT=m
++CONFIG_INET6_XFRM_MODE_TUNNEL=m
++CONFIG_INET6_XFRM_MODE_BEET=m
++# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
++# CONFIG_IPV6_VTI is not set
++CONFIG_IPV6_SIT=m
++# CONFIG_IPV6_SIT_6RD is not set
++CONFIG_IPV6_NDISC_NODETYPE=y
++# CONFIG_IPV6_TUNNEL is not set
++# CONFIG_IPV6_MULTIPLE_TABLES is not set
++# CONFIG_IPV6_MROUTE is not set
++# CONFIG_IPV6_SEG6_LWTUNNEL is not set
++# CONFIG_IPV6_SEG6_HMAC is not set
++# CONFIG_NETWORK_SECMARK is not set
++# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
++CONFIG_NETFILTER=y
++CONFIG_NETFILTER_ADVANCED=y
++
++#
++# Core Netfilter Configuration
++#
++CONFIG_NETFILTER_INGRESS=y
++# CONFIG_NETFILTER_NETLINK_ACCT is not set
++# CONFIG_NETFILTER_NETLINK_QUEUE is not set
++# CONFIG_NETFILTER_NETLINK_LOG is not set
++# CONFIG_NETFILTER_NETLINK_OSF is not set
++# CONFIG_NF_CONNTRACK is not set
++# CONFIG_NF_LOG_NETDEV is not set
++# CONFIG_NF_TABLES is not set
++# CONFIG_NETFILTER_XTABLES is not set
++# CONFIG_IP_SET is not set
++# CONFIG_IP_VS is not set
++
++#
++# IP: Netfilter Configuration
++#
++# CONFIG_NF_SOCKET_IPV4 is not set
++# CONFIG_NF_TPROXY_IPV4 is not set
++# CONFIG_NF_DUP_IPV4 is not set
++# CONFIG_NF_LOG_ARP is not set
++# CONFIG_NF_LOG_IPV4 is not set
++# CONFIG_NF_REJECT_IPV4 is not set
++# CONFIG_IP_NF_IPTABLES is not set
++# CONFIG_IP_NF_ARPTABLES is not set
++
++#
++# IPv6: Netfilter Configuration
++#
++# CONFIG_NF_SOCKET_IPV6 is not set
++# CONFIG_NF_TPROXY_IPV6 is not set
++# CONFIG_NF_DUP_IPV6 is not set
++# CONFIG_NF_REJECT_IPV6 is not set
++# CONFIG_NF_LOG_IPV6 is not set
++# CONFIG_IP6_NF_IPTABLES is not set
++# CONFIG_BPFILTER is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_RDS is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_L2TP is not set
++# CONFIG_BRIDGE is not set
++CONFIG_HAVE_NET_DSA=y
++# CONFIG_NET_DSA is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_PHONET is not set
++# CONFIG_6LOWPAN is not set
++# CONFIG_IEEE802154 is not set
++# CONFIG_NET_SCHED is not set
++# CONFIG_DCB is not set
++# CONFIG_BATMAN_ADV is not set
++# CONFIG_OPENVSWITCH is not set
++# CONFIG_VSOCKETS is not set
++# CONFIG_NETLINK_DIAG is not set
++# CONFIG_MPLS is not set
++# CONFIG_NET_NSH is not set
++# CONFIG_HSR is not set
++# CONFIG_NET_SWITCHDEV is not set
++# CONFIG_NET_L3_MASTER_DEV is not set
++# CONFIG_NET_NCSI is not set
++CONFIG_RPS=y
++CONFIG_RFS_ACCEL=y
++CONFIG_XPS=y
++CONFIG_NET_RX_BUSY_POLL=y
++CONFIG_BQL=y
++# CONFIG_BPF_JIT is not set
++# CONFIG_BPF_STREAM_PARSER is not set
++CONFIG_NET_FLOW_LIMIT=y
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
++# CONFIG_BT is not set
++# CONFIG_AF_RXRPC is not set
++# CONFIG_AF_KCM is not set
++CONFIG_WIRELESS=y
++# CONFIG_CFG80211 is not set
++
++#
++# CFG80211 needs to be enabled for MAC80211
++#
++CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
++# CONFIG_WIMAX is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++# CONFIG_CAIF is not set
++# CONFIG_CEPH_LIB is not set
++# CONFIG_NFC is not set
++# CONFIG_PSAMPLE is not set
++# CONFIG_NET_IFE is not set
++# CONFIG_LWTUNNEL is not set
++CONFIG_DST_CACHE=y
++CONFIG_GRO_CELLS=y
++# CONFIG_NET_DEVLINK is not set
++CONFIG_MAY_USE_DEVLINK=y
++# CONFIG_FAILOVER is not set
++CONFIG_HAVE_EBPF_JIT=y
++
++#
++# Device Drivers
++#
++CONFIG_ARM_AMBA=y
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER=y
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_DEVTMPFS=y
++CONFIG_DEVTMPFS_MOUNT=y
++CONFIG_STANDALONE=y
++# CONFIG_PREVENT_FIRMWARE_BUILD is not set
++
++#
++# Firmware loader
++#
++CONFIG_FW_LOADER=y
++CONFIG_EXTRA_FIRMWARE=""
++# CONFIG_FW_LOADER_USER_HELPER is not set
++CONFIG_ALLOW_DEV_COREDUMP=y
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
++# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
++CONFIG_GENERIC_CPU_AUTOPROBE=y
++CONFIG_GENERIC_CPU_VULNERABILITIES=y
++CONFIG_REGMAP=y
++CONFIG_REGMAP_I2C=y
++CONFIG_REGMAP_SPI=y
++CONFIG_REGMAP_MMIO=y
++CONFIG_DMA_SHARED_BUFFER=y
++# CONFIG_DMA_FENCE_TRACE is not set
++CONFIG_DMA_CMA=y
++
++#
++# Default contiguous memory area size:
++#
++CONFIG_CMA_SIZE_MBYTES=4
++CONFIG_CMA_SIZE_SEL_MBYTES=y
++# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
++# CONFIG_CMA_SIZE_SEL_MIN is not set
++# CONFIG_CMA_SIZE_SEL_MAX is not set
++CONFIG_CMA_ALIGNMENT=8
++CONFIG_GENERIC_ARCH_TOPOLOGY=y
++
++#
++# Bus devices
++#
++# CONFIG_BRCMSTB_GISB_ARB is not set
++# CONFIG_SIMPLE_PM_BUS is not set
++# CONFIG_VEXPRESS_CONFIG is not set
++# CONFIG_CONNECTOR is not set
++# CONFIG_GNSS is not set
++CONFIG_MTD=y
++# CONFIG_MTD_TESTS is not set
++# CONFIG_MTD_REDBOOT_PARTS is not set
++CONFIG_MTD_CMDLINE_PARTS=y
++# CONFIG_MTD_AFS_PARTS is not set
++CONFIG_MTD_OF_PARTS=y
++# CONFIG_MTD_AR7_PARTS is not set
++
++#
++# Partition parsers
++#
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_SM_FTL is not set
++# CONFIG_MTD_OOPS is not set
++# CONFIG_MTD_PARTITIONED_MASTER is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++# CONFIG_MTD_CFI is not set
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_INTEL_VR_NOR is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_PMC551 is not set
++# CONFIG_MTD_DATAFLASH is not set
++# CONFIG_MTD_M25P80 is not set
++# CONFIG_MTD_MCHP23K256 is not set
++# CONFIG_MTD_SST25L is not set
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++CONFIG_MTD_BLOCK2MTD=y
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOCG3 is not set
++# CONFIG_MTD_ONENAND is not set
++# CONFIG_MTD_SPI_NAND_BSP is not set
++# CONFIG_BSP_NAND_ECC_STATUS_REPORT is not set
++# CONFIG_BSP_NAND_FS_MAY_NO_YAFFS2 is not set
++CONFIG_MTD_NAND_ECC=y
++# CONFIG_MTD_NAND_ECC_SMC is not set
++CONFIG_MTD_NAND=y
++# CONFIG_MTD_NAND_ECC_BCH is not set
++# CONFIG_MTD_NAND_DENALI_PCI is not set
++# CONFIG_MTD_NAND_DENALI_DT is not set
++# CONFIG_MTD_NAND_GPIO is not set
++# CONFIG_MTD_NAND_RICOH is not set
++# CONFIG_MTD_NAND_DISKONCHIP is not set
++# CONFIG_MTD_NAND_DOCG4 is not set
++# CONFIG_MTD_NAND_CAFE is not set
++# CONFIG_MTD_NAND_NANDSIM is not set
++# CONFIG_MTD_NAND_BRCMNAND is not set
++# CONFIG_MTD_NAND_PLATFORM is not set
++CONFIG_MTD_NAND_FMC100=y
++# CONFIG_FMC100_NAND_EDO_MODE is not set
++CONFIG_RW_H_WIDTH=10
++CONFIG_R_L_WIDTH=10
++CONFIG_W_L_WIDTH=10
++# CONFIG_MTD_SPI_NAND is not set
++
++#
++# LPDDR & LPDDR2 PCM memory drivers
++#
++# CONFIG_MTD_LPDDR is not set
++CONFIG_MTD_SPI_NOR=y
++# CONFIG_MTD_MT81xx_NOR is not set
++# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set
++# CONFIG_SPI_CADENCE_QUADSPI is not set
++CONFIG_SPI_BSP_SFC=y
++# CONFIG_MTD_SPI_IDS is not set
++# CONFIG_CLOSE_SPI_8PIN_4IO is not set
++CONFIG_BSP_SPI_BLOCK_PROTECT=y
++CONFIG_MTD_UBI=y
++CONFIG_MTD_UBI_WL_THRESHOLD=4096
++CONFIG_MTD_UBI_BEB_LIMIT=20
++# CONFIG_MTD_UBI_FASTMAP is not set
++# CONFIG_MTD_UBI_GLUEBI is not set
++# CONFIG_MTD_UBI_BLOCK is not set
++CONFIG_DTC=y
++CONFIG_OF=y
++# CONFIG_OF_UNITTEST is not set
++CONFIG_OF_FLATTREE=y
++CONFIG_OF_EARLY_FLATTREE=y
++CONFIG_OF_KOBJ=y
++CONFIG_OF_ADDRESS=y
++CONFIG_OF_IRQ=y
++CONFIG_OF_NET=y
++CONFIG_OF_MDIO=y
++CONFIG_OF_RESERVED_MEM=y
++# CONFIG_OF_OVERLAY is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_NULL_BLK is not set
++# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
++# CONFIG_BLK_DEV_DAC960 is not set
++# CONFIG_BLK_DEV_UMEM is not set
++CONFIG_BLK_DEV_LOOP=y
++CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_DRBD is not set
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_SKD is not set
++# CONFIG_BLK_DEV_SX8 is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=65536
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++# CONFIG_BLK_DEV_RBD is not set
++# CONFIG_BLK_DEV_RSXX is not set
++
++#
++# NVME Support
++#
++# CONFIG_BLK_DEV_NVME is not set
++# CONFIG_NVME_FC is not set
++# CONFIG_NVME_TARGET is not set
++
++#
++# Misc devices
++#
++# CONFIG_AD525X_DPOT is not set
++# CONFIG_DUMMY_IRQ is not set
++# CONFIG_PHANTOM is not set
++# CONFIG_SGI_IOC4 is not set
++# CONFIG_TIFM_CORE is not set
++# CONFIG_ICS932S401 is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_HP_ILO is not set
++# CONFIG_APDS9802ALS is not set
++# CONFIG_ISL29003 is not set
++# CONFIG_ISL29020 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_SENSORS_BH1770 is not set
++# CONFIG_SENSORS_APDS990X is not set
++# CONFIG_HMC6352 is not set
++# CONFIG_DS1682 is not set
++# CONFIG_USB_SWITCH_FSA9480 is not set
++# CONFIG_LATTICE_ECP3_CONFIG is not set
++# CONFIG_SRAM is not set
++# CONFIG_PCI_ENDPOINT_TEST is not set
++# CONFIG_C2PORT is not set
++
++#
++# EEPROM support
++#
++# CONFIG_EEPROM_AT24 is not set
++# CONFIG_EEPROM_AT25 is not set
++# CONFIG_EEPROM_LEGACY is not set
++# CONFIG_EEPROM_MAX6875 is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_EEPROM_93XX46 is not set
++# CONFIG_EEPROM_IDT_89HPESX is not set
++# CONFIG_CB710_CORE is not set
++
++#
++# Texas Instruments shared transport line discipline
++#
++# CONFIG_TI_ST is not set
++# CONFIG_SENSORS_LIS3_SPI is not set
++# CONFIG_SENSORS_LIS3_I2C is not set
++# CONFIG_ALTERA_STAPL is not set
++
++#
++# Intel MIC & related support
++#
++
++#
++# Intel MIC Bus Driver
++#
++
++#
++# SCIF Bus Driver
++#
++
++#
++# VOP Bus Driver
++#
++
++#
++# Intel MIC Host Driver
++#
++
++#
++# Intel MIC Card Driver
++#
++
++#
++# SCIF Driver
++#
++
++#
++# Intel MIC Coprocessor State Management (COSM) Drivers
++#
++
++#
++# VOP Driver
++#
++# CONFIG_GENWQE is not set
++# CONFIG_ECHO is not set
++# CONFIG_MISC_RTSX_PCI is not set
++# CONFIG_MISC_RTSX_USB is not set
++
++#
++# SCSI device support
++#
++CONFIG_SCSI_MOD=y
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_DMA=y
++# CONFIG_SCSI_MQ_DEFAULT is not set
++CONFIG_SCSI_PROC_FS=y
++
++#
++# SCSI support type (disk, tape, CD-ROM)
++#
++CONFIG_BLK_DEV_SD=y
++# CONFIG_CHR_DEV_ST is not set
++# CONFIG_CHR_DEV_OSST is not set
++# CONFIG_BLK_DEV_SR is not set
++# CONFIG_CHR_DEV_SG is not set
++# CONFIG_CHR_DEV_SCH is not set
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++# CONFIG_SCSI_SCAN_ASYNC is not set
++
++#
++# SCSI Transports
++#
++# CONFIG_SCSI_SPI_ATTRS is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++# CONFIG_SCSI_SRP_ATTRS is not set
++CONFIG_SCSI_LOWLEVEL=y
++# CONFIG_ISCSI_TCP is not set
++# CONFIG_ISCSI_BOOT_SYSFS is not set
++# CONFIG_SCSI_CXGB3_ISCSI is not set
++# CONFIG_SCSI_CXGB4_ISCSI is not set
++# CONFIG_SCSI_BNX2_ISCSI is not set
++# CONFIG_BE2ISCSI is not set
++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
++# CONFIG_SCSI_HPSA is not set
++# CONFIG_SCSI_3W_9XXX is not set
++# CONFIG_SCSI_3W_SAS is not set
++# CONFIG_SCSI_ACARD is not set
++# CONFIG_SCSI_AACRAID is not set
++# CONFIG_SCSI_AIC7XXX is not set
++# CONFIG_SCSI_AIC79XX is not set
++# CONFIG_SCSI_AIC94XX is not set
++# CONFIG_SCSI_MVSAS is not set
++# CONFIG_SCSI_MVUMI is not set
++# CONFIG_SCSI_ADVANSYS is not set
++# CONFIG_SCSI_ARCMSR is not set
++# CONFIG_SCSI_ESAS2R is not set
++# CONFIG_MEGARAID_NEWGEN is not set
++# CONFIG_MEGARAID_LEGACY is not set
++# CONFIG_MEGARAID_SAS is not set
++# CONFIG_SCSI_MPT3SAS is not set
++# CONFIG_SCSI_MPT2SAS is not set
++# CONFIG_SCSI_SMARTPQI is not set
++# CONFIG_SCSI_UFSHCD is not set
++# CONFIG_SCSI_HPTIOP is not set
++# CONFIG_SCSI_SNIC is not set
++# CONFIG_SCSI_DMX3191D is not set
++# CONFIG_SCSI_IPS is not set
++# CONFIG_SCSI_INITIO is not set
++# CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_STEX is not set
++# CONFIG_SCSI_SYM53C8XX_2 is not set
++# CONFIG_SCSI_QLOGIC_1280 is not set
++# CONFIG_SCSI_QLA_ISCSI is not set
++# CONFIG_SCSI_DC395x is not set
++# CONFIG_SCSI_AM53C974 is not set
++# CONFIG_SCSI_WD719X is not set
++# CONFIG_SCSI_DEBUG is not set
++# CONFIG_SCSI_PMCRAID is not set
++# CONFIG_SCSI_PM8001 is not set
++# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
++# CONFIG_SCSI_DH is not set
++# CONFIG_SCSI_OSD_INITIATOR is not set
++CONFIG_HAVE_PATA_PLATFORM=y
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_TARGET_CORE is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_FIREWIRE_NOSY is not set
++CONFIG_NETDEVICES=y
++CONFIG_NET_CORE=y
++# CONFIG_BONDING is not set
++# CONFIG_DUMMY is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_NET_FC is not set
++# CONFIG_NET_TEAM is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_IPVLAN is not set
++# CONFIG_VXLAN is not set
++# CONFIG_GENEVE is not set
++# CONFIG_GTP is not set
++# CONFIG_MACSEC is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_TUN is not set
++# CONFIG_TUN_VNET_CROSS_LE is not set
++# CONFIG_VETH is not set
++# CONFIG_NLMON is not set
++# CONFIG_ARCNET is not set
++
++#
++# CAIF transport drivers
++#
++
++#
++# Distributed Switch Architecture drivers
++#
++CONFIG_ETHERNET=y
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_VENDOR_ADAPTEC is not set
++# CONFIG_NET_VENDOR_AGERE is not set
++# CONFIG_NET_VENDOR_ALACRITECH is not set
++# CONFIG_NET_VENDOR_ALTEON is not set
++# CONFIG_ALTERA_TSE is not set
++# CONFIG_NET_VENDOR_AMAZON is not set
++# CONFIG_NET_VENDOR_AMD is not set
++# CONFIG_NET_VENDOR_AQUANTIA is not set
++# CONFIG_NET_VENDOR_ARC is not set
++# CONFIG_NET_VENDOR_ATHEROS is not set
++# CONFIG_NET_VENDOR_AURORA is not set
++# CONFIG_NET_VENDOR_BROADCOM is not set
++# CONFIG_NET_VENDOR_BROCADE is not set
++# CONFIG_NET_VENDOR_CADENCE is not set
++# CONFIG_NET_VENDOR_CAVIUM is not set
++# CONFIG_NET_VENDOR_CHELSIO is not set
++# CONFIG_NET_VENDOR_CISCO is not set
++# CONFIG_NET_VENDOR_CORTINA is not set
++# CONFIG_DNET is not set
++# CONFIG_NET_VENDOR_DEC is not set
++# CONFIG_NET_VENDOR_DLINK is not set
++# CONFIG_NET_VENDOR_EMULEX is not set
++# CONFIG_NET_VENDOR_EZCHIP is not set
++# CONFIG_NET_VENDOR_HISILICON is not set
++# CONFIG_NET_VENDOR_HP is not set
++# CONFIG_NET_VENDOR_HUAWEI is not set
++# CONFIG_NET_VENDOR_INTEL is not set
++CONFIG_NET_VENDOR_BSP=y
++# CONFIG_BSP_FEMAC is not set
++CONFIG_ETH_GMAC=y
++CONFIG_GMAC_DDR_64BIT=y
++CONFIG_GMAC_DESC_4WORD=y
++CONFIG_GMAC_RXCSUM=y
++CONFIG_RX_FLOW_CTRL_SUPPORT=y
++CONFIG_TX_FLOW_CTRL_SUPPORT=y
++CONFIG_TX_FLOW_CTRL_PAUSE_TIME=0xFFFF
++CONFIG_TX_FLOW_CTRL_PAUSE_INTERVAL=0xFFFF
++CONFIG_TX_FLOW_CTRL_ACTIVE_THRESHOLD=16
++CONFIG_TX_FLOW_CTRL_DEACTIVE_THRESHOLD=32
++# CONFIG_JME is not set
++# CONFIG_NET_VENDOR_MARVELL is not set
++# CONFIG_NET_VENDOR_MELLANOX is not set
++# CONFIG_NET_VENDOR_MICREL is not set
++# CONFIG_NET_VENDOR_MICROCHIP is not set
++# CONFIG_NET_VENDOR_MICROSEMI is not set
++# CONFIG_NET_VENDOR_MYRI is not set
++# CONFIG_FEALNX is not set
++# CONFIG_NET_VENDOR_NATSEMI is not set
++# CONFIG_NET_VENDOR_NETERION is not set
++# CONFIG_NET_VENDOR_NETRONOME is not set
++# CONFIG_NET_VENDOR_NI is not set
++# CONFIG_NET_VENDOR_NVIDIA is not set
++# CONFIG_NET_VENDOR_OKI is not set
++# CONFIG_ETHOC is not set
++# CONFIG_NET_VENDOR_PACKET_ENGINES is not set
++# CONFIG_NET_VENDOR_QLOGIC is not set
++# CONFIG_NET_VENDOR_QUALCOMM is not set
++# CONFIG_NET_VENDOR_RDC is not set
++# CONFIG_NET_VENDOR_REALTEK is not set
++# CONFIG_NET_VENDOR_RENESAS is not set
++# CONFIG_NET_VENDOR_ROCKER is not set
++# CONFIG_NET_VENDOR_SAMSUNG is not set
++# CONFIG_NET_VENDOR_SEEQ is not set
++# CONFIG_NET_VENDOR_SOLARFLARE is not set
++# CONFIG_NET_VENDOR_SILAN is not set
++# CONFIG_NET_VENDOR_SIS is not set
++# CONFIG_NET_VENDOR_SMSC is not set
++# CONFIG_NET_VENDOR_SOCIONEXT is not set
++# CONFIG_NET_VENDOR_STMICRO is not set
++# CONFIG_NET_VENDOR_SUN is not set
++# CONFIG_NET_VENDOR_SYNOPSYS is not set
++# CONFIG_NET_VENDOR_TEHUTI is not set
++# CONFIG_NET_VENDOR_TI is not set
++# CONFIG_NET_VENDOR_VIA is not set
++# CONFIG_NET_VENDOR_WIZNET is not set
++# CONFIG_FDDI is not set
++# CONFIG_HIPPI is not set
++CONFIG_MDIO_DEVICE=y
++CONFIG_MDIO_BUS=y
++# CONFIG_MDIO_BCM_UNIMAC is not set
++# CONFIG_MDIO_BITBANG is not set
++# CONFIG_MDIO_BUS_MUX_GPIO is not set
++# CONFIG_MDIO_BUS_MUX_MMIOREG is not set
++# CONFIG_MDIO_HISI_FEMAC is not set
++# CONFIG_MDIO_BSP_FEMAC is not set
++CONFIG_MDIO_BSP_GEMAC=y
++# CONFIG_MDIO_MSCC_MIIM is not set
++# CONFIG_MDIO_OCTEON is not set
++# CONFIG_MDIO_THUNDER is not set
++CONFIG_PHYLIB=y
++CONFIG_SWPHY=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_AMD_PHY is not set
++# CONFIG_AQUANTIA_PHY is not set
++# CONFIG_AX88796B_PHY is not set
++# CONFIG_AT803X_PHY is not set
++# CONFIG_BCM7XXX_PHY is not set
++# CONFIG_BCM87XX_PHY is not set
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_CORTINA_PHY is not set
++# CONFIG_DAVICOM_PHY is not set
++# CONFIG_DP83822_PHY is not set
++# CONFIG_DP83TC811_PHY is not set
++# CONFIG_DP83848_PHY is not set
++# CONFIG_DP83867_PHY is not set
++CONFIG_FIXED_PHY=y
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_INTEL_XWAY_PHY is not set
++# CONFIG_LSI_ET1011C_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_MARVELL_PHY is not set
++# CONFIG_MARVELL_10G_PHY is not set
++# CONFIG_MICREL_PHY is not set
++# CONFIG_MICROCHIP_PHY is not set
++# CONFIG_MICROCHIP_T1_PHY is not set
++# CONFIG_MICROSEMI_PHY is not set
++# CONFIG_NATIONAL_PHY is not set
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_REALTEK_PHY is not set
++# CONFIG_RENESAS_PHY is not set
++# CONFIG_ROCKCHIP_PHY is not set
++# CONFIG_SMSC_PHY is not set
++# CONFIG_STE10XP is not set
++# CONFIG_TERANETICS_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++# CONFIG_XILINX_GMII2RGMII is not set
++# CONFIG_MICREL_KS8995MA is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++CONFIG_USB_NET_DRIVERS=y
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_RTL8152 is not set
++# CONFIG_USB_LAN78XX is not set
++# CONFIG_USB_USBNET is not set
++# CONFIG_USB_IPHETH is not set
++# CONFIG_WLAN is not set
++
++#
++# Enable WiMAX (Networking options) to see the WiMAX drivers
++#
++# CONFIG_WAN is not set
++# CONFIG_VMXNET3 is not set
++# CONFIG_NET_FAILOVER is not set
++# CONFIG_ISDN is not set
++# CONFIG_NVM is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++CONFIG_INPUT_FF_MEMLESS=y
++# CONFIG_INPUT_POLLDEV is not set
++# CONFIG_INPUT_SPARSEKMAP is not set
++# CONFIG_INPUT_MATRIXKMAP is not set
++
++#
++# Userland interfaces
++#
++CONFIG_INPUT_MOUSEDEV=y
++CONFIG_INPUT_MOUSEDEV_PSAUX=y
++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
++CONFIG_INPUT_JOYDEV=y
++CONFIG_INPUT_EVDEV=y
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++CONFIG_INPUT_KEYBOARD=y
++# CONFIG_KEYBOARD_ADP5588 is not set
++# CONFIG_KEYBOARD_ADP5589 is not set
++CONFIG_KEYBOARD_ATKBD=y
++# CONFIG_KEYBOARD_QT1070 is not set
++# CONFIG_KEYBOARD_QT2160 is not set
++# CONFIG_KEYBOARD_DLINK_DIR685 is not set
++# CONFIG_KEYBOARD_LKKBD is not set
++# CONFIG_KEYBOARD_GPIO is not set
++# CONFIG_KEYBOARD_GPIO_POLLED is not set
++# CONFIG_KEYBOARD_TCA6416 is not set
++# CONFIG_KEYBOARD_TCA8418 is not set
++# CONFIG_KEYBOARD_MATRIX is not set
++# CONFIG_KEYBOARD_LM8333 is not set
++# CONFIG_KEYBOARD_MAX7359 is not set
++# CONFIG_KEYBOARD_MCS is not set
++# CONFIG_KEYBOARD_MPR121 is not set
++# CONFIG_KEYBOARD_NEWTON is not set
++# CONFIG_KEYBOARD_OPENCORES is not set
++# CONFIG_KEYBOARD_SAMSUNG is not set
++# CONFIG_KEYBOARD_STOWAWAY is not set
++# CONFIG_KEYBOARD_SUNKBD is not set
++# CONFIG_KEYBOARD_OMAP4 is not set
++# CONFIG_KEYBOARD_XTKBD is not set
++# CONFIG_KEYBOARD_CAP11XX is not set
++# CONFIG_KEYBOARD_BCM is not set
++CONFIG_INPUT_MOUSE=y
++CONFIG_MOUSE_PS2=y
++CONFIG_MOUSE_PS2_ALPS=y
++CONFIG_MOUSE_PS2_BYD=y
++CONFIG_MOUSE_PS2_LOGIPS2PP=y
++CONFIG_MOUSE_PS2_SYNAPTICS=y
++CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y
++CONFIG_MOUSE_PS2_CYPRESS=y
++CONFIG_MOUSE_PS2_TRACKPOINT=y
++# CONFIG_MOUSE_PS2_ELANTECH is not set
++# CONFIG_MOUSE_PS2_SENTELIC is not set
++# CONFIG_MOUSE_PS2_TOUCHKIT is not set
++CONFIG_MOUSE_PS2_FOCALTECH=y
++CONFIG_MOUSE_PS2_SMBUS=y
++# CONFIG_MOUSE_SERIAL is not set
++# CONFIG_MOUSE_APPLETOUCH is not set
++# CONFIG_MOUSE_BCM5974 is not set
++# CONFIG_MOUSE_CYAPA is not set
++# CONFIG_MOUSE_ELAN_I2C is not set
++# CONFIG_MOUSE_VSXXXAA is not set
++# CONFIG_MOUSE_GPIO is not set
++# CONFIG_MOUSE_SYNAPTICS_I2C is not set
++# CONFIG_MOUSE_SYNAPTICS_USB is not set
++CONFIG_INPUT_JOYSTICK=y
++# CONFIG_JOYSTICK_ANALOG is not set
++# CONFIG_JOYSTICK_A3D is not set
++# CONFIG_JOYSTICK_ADI is not set
++# CONFIG_JOYSTICK_COBRA is not set
++# CONFIG_JOYSTICK_GF2K is not set
++# CONFIG_JOYSTICK_GRIP is not set
++# CONFIG_JOYSTICK_GRIP_MP is not set
++# CONFIG_JOYSTICK_GUILLEMOT is not set
++# CONFIG_JOYSTICK_INTERACT is not set
++# CONFIG_JOYSTICK_SIDEWINDER is not set
++# CONFIG_JOYSTICK_TMDC is not set
++# CONFIG_JOYSTICK_IFORCE is not set
++# CONFIG_JOYSTICK_WARRIOR is not set
++# CONFIG_JOYSTICK_MAGELLAN is not set
++# CONFIG_JOYSTICK_SPACEORB is not set
++# CONFIG_JOYSTICK_SPACEBALL is not set
++# CONFIG_JOYSTICK_STINGER is not set
++# CONFIG_JOYSTICK_TWIDJOY is not set
++# CONFIG_JOYSTICK_ZHENHUA is not set
++# CONFIG_JOYSTICK_AS5011 is not set
++# CONFIG_JOYSTICK_JOYDUMP is not set
++# CONFIG_JOYSTICK_XPAD is not set
++# CONFIG_JOYSTICK_PSXPAD_SPI is not set
++# CONFIG_JOYSTICK_PXRC is not set
++# CONFIG_INPUT_TABLET is not set
++# CONFIG_INPUT_TOUCHSCREEN is not set
++CONFIG_INPUT_MISC=y
++# CONFIG_INPUT_AD714X is not set
++# CONFIG_INPUT_ATMEL_CAPTOUCH is not set
++# CONFIG_INPUT_BMA150 is not set
++# CONFIG_INPUT_E3X0_BUTTON is not set
++# CONFIG_INPUT_MMA8450 is not set
++# CONFIG_INPUT_GP2A is not set
++# CONFIG_INPUT_GPIO_BEEPER is not set
++# CONFIG_INPUT_GPIO_DECODER is not set
++# CONFIG_INPUT_ATI_REMOTE2 is not set
++# CONFIG_INPUT_KEYSPAN_REMOTE is not set
++# CONFIG_INPUT_KXTJ9 is not set
++# CONFIG_INPUT_POWERMATE is not set
++# CONFIG_INPUT_YEALINK is not set
++# CONFIG_INPUT_CM109 is not set
++# CONFIG_INPUT_REGULATOR_HAPTIC is not set
++CONFIG_INPUT_UINPUT=y
++# CONFIG_INPUT_PCF8574 is not set
++# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
++# CONFIG_INPUT_ADXL34X is not set
++# CONFIG_INPUT_CMA3000 is not set
++# CONFIG_INPUT_DRV260X_HAPTICS is not set
++# CONFIG_INPUT_DRV2665_HAPTICS is not set
++# CONFIG_INPUT_DRV2667_HAPTICS is not set
++# CONFIG_RMI4_CORE is not set
++
++#
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_SERPORT=y
++# CONFIG_SERIO_AMBAKMI is not set
++# CONFIG_SERIO_PCIPS2 is not set
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_SERIO_ALTERA_PS2 is not set
++# CONFIG_SERIO_PS2MULT is not set
++# CONFIG_SERIO_ARC_PS2 is not set
++# CONFIG_SERIO_APBPS2 is not set
++# CONFIG_SERIO_GPIO_PS2 is not set
++# CONFIG_USERIO is not set
++CONFIG_GAMEPORT=y
++# CONFIG_GAMEPORT_NS558 is not set
++# CONFIG_GAMEPORT_L4 is not set
++# CONFIG_GAMEPORT_EMU10K1 is not set
++# CONFIG_GAMEPORT_FM801 is not set
++
++#
++# Character devices
++#
++CONFIG_TTY=y
++CONFIG_VT=y
++CONFIG_CONSOLE_TRANSLATIONS=y
++CONFIG_VT_CONSOLE=y
++CONFIG_VT_CONSOLE_SLEEP=y
++CONFIG_HW_CONSOLE=y
++# CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_UNIX98_PTYS=y
++# CONFIG_LEGACY_PTYS is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_NOZOMI is not set
++# CONFIG_N_GSM is not set
++# CONFIG_TRACE_SINK is not set
++CONFIG_LDISC_AUTOLOAD=y
++CONFIG_DEVMEM=y
++
++#
++# Serial drivers
++#
++CONFIG_SERIAL_EARLYCON=y
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++# CONFIG_SERIAL_AMBA_PL010 is not set
++CONFIG_SERIAL_AMBA_PL011=y
++CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
++# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set
++# CONFIG_SERIAL_MAX3100 is not set
++# CONFIG_SERIAL_MAX310X is not set
++# CONFIG_SERIAL_UARTLITE is not set
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++# CONFIG_SERIAL_JSM is not set
++# CONFIG_SERIAL_SCCNXP is not set
++# CONFIG_SERIAL_SC16IS7XX is not set
++# CONFIG_SERIAL_ALTERA_JTAGUART is not set
++# CONFIG_SERIAL_ALTERA_UART is not set
++# CONFIG_SERIAL_IFX6X60 is not set
++# CONFIG_SERIAL_XILINX_PS_UART is not set
++# CONFIG_SERIAL_ARC is not set
++# CONFIG_SERIAL_RP2 is not set
++# CONFIG_SERIAL_FSL_LPUART is not set
++# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set
++# CONFIG_SERIAL_DEV_BUS is not set
++# CONFIG_TTY_PRINTK is not set
++# CONFIG_HVC_DCC is not set
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_APPLICOM is not set
++
++#
++# PCMCIA character devices
++#
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++CONFIG_DEVPORT=y
++# CONFIG_XILLYBUS is not set
++
++#
++# I2C support
++#
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++# CONFIG_I2C_COMPAT is not set
++CONFIG_I2C_CHARDEV=y
++CONFIG_I2C_MUX=y
++
++#
++# Multiplexer I2C Chip support
++#
++# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set
++# CONFIG_I2C_MUX_GPIO is not set
++# CONFIG_I2C_MUX_GPMUX is not set
++# CONFIG_I2C_MUX_LTC4306 is not set
++# CONFIG_I2C_MUX_PCA9541 is not set
++# CONFIG_I2C_MUX_PCA954x is not set
++# CONFIG_I2C_MUX_PINCTRL is not set
++# CONFIG_I2C_MUX_REG is not set
++# CONFIG_I2C_DEMUX_PINCTRL is not set
++# CONFIG_I2C_MUX_MLXCPLD is not set
++# CONFIG_I2C_HELPER_AUTO is not set
++# CONFIG_I2C_SMBUS is not set
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++
++#
++# I2C Hardware Bus support
++#
++
++#
++# PC SMBus host controller drivers
++#
++# CONFIG_I2C_ALI1535 is not set
++# CONFIG_I2C_ALI1563 is not set
++# CONFIG_I2C_ALI15X3 is not set
++# CONFIG_I2C_AMD756 is not set
++# CONFIG_I2C_AMD8111 is not set
++# CONFIG_I2C_I801 is not set
++# CONFIG_I2C_ISCH is not set
++# CONFIG_I2C_PIIX4 is not set
++# CONFIG_I2C_NFORCE2 is not set
++# CONFIG_I2C_SIS5595 is not set
++# CONFIG_I2C_SIS630 is not set
++# CONFIG_I2C_SIS96X is not set
++# CONFIG_I2C_VIA is not set
++# CONFIG_I2C_VIAPRO is not set
++
++#
++# I2C system bus drivers (mostly embedded / system-on-chip)
++#
++# CONFIG_I2C_CADENCE is not set
++# CONFIG_I2C_CBUS_GPIO is not set
++# CONFIG_I2C_DESIGNWARE_PLATFORM is not set
++# CONFIG_I2C_DESIGNWARE_PCI is not set
++# CONFIG_I2C_EMEV2 is not set
++# CONFIG_I2C_GPIO is not set
++CONFIG_I2C_BSP=y
++# CONFIG_I2C_NOMADIK is not set
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
++# CONFIG_I2C_RK3X is not set
++# CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_THUNDERX is not set
++# CONFIG_I2C_XILINX is not set
++
++#
++# External I2C/SMBus adapter drivers
++#
++# CONFIG_I2C_DIOLAN_U2C is not set
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_ROBOTFUZZ_OSIF is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_TINY_USB is not set
++
++#
++# Other I2C/SMBus bus drivers
++#
++CONFIG_DMA_MSG_MIN_LEN=5
++CONFIG_DMA_MSG_MAX_LEN=4090
++# CONFIG_I2C_STUB is not set
++# CONFIG_I2C_SLAVE is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++CONFIG_SPI=y
++# CONFIG_SPI_DEBUG is not set
++CONFIG_SPI_MASTER=y
++# CONFIG_SPI_MEM is not set
++
++#
++# SPI Master Controller Drivers
++#
++# CONFIG_SPI_ALTERA is not set
++# CONFIG_SPI_AXI_SPI_ENGINE is not set
++# CONFIG_SPI_BITBANG is not set
++# CONFIG_SPI_CADENCE is not set
++# CONFIG_SPI_DESIGNWARE is not set
++# CONFIG_SPI_GPIO is not set
++# CONFIG_SPI_FSL_SPI is not set
++# CONFIG_SPI_OC_TINY is not set
++CONFIG_SPI_PL022=y
++# CONFIG_SPI_PXA2XX is not set
++# CONFIG_SPI_ROCKCHIP is not set
++# CONFIG_SPI_SC18IS602 is not set
++# CONFIG_SPI_THUNDERX is not set
++# CONFIG_SPI_XCOMM is not set
++# CONFIG_SPI_XILINX is not set
++# CONFIG_SPI_ZYNQMP_GQSPI is not set
++
++#
++# SPI Protocol Masters
++#
++CONFIG_SPI_SPIDEV=y
++# CONFIG_SPI_LOOPBACK_TEST is not set
++# CONFIG_SPI_TLE62X0 is not set
++# CONFIG_SPI_SLAVE is not set
++# CONFIG_SPMI is not set
++# CONFIG_HSI is not set
++# CONFIG_PPS is not set
++
++#
++# PTP clock support
++#
++# CONFIG_PTP_1588_CLOCK is not set
++
++#
++# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
++#
++CONFIG_PINCTRL=y
++CONFIG_GENERIC_PINCTRL_GROUPS=y
++CONFIG_PINMUX=y
++CONFIG_GENERIC_PINMUX_FUNCTIONS=y
++CONFIG_PINCONF=y
++CONFIG_GENERIC_PINCONF=y
++# CONFIG_DEBUG_PINCTRL is not set
++# CONFIG_PINCTRL_AMD is not set
++# CONFIG_PINCTRL_MCP23S08 is not set
++CONFIG_PINCTRL_SINGLE=y
++# CONFIG_PINCTRL_SX150X is not set
++CONFIG_GPIOLIB=y
++CONFIG_GPIOLIB_FASTPATH_LIMIT=512
++CONFIG_OF_GPIO=y
++CONFIG_GPIOLIB_IRQCHIP=y
++# CONFIG_DEBUG_GPIO is not set
++CONFIG_GPIO_SYSFS=y
++CONFIG_GPIO_GENERIC=y
++
++#
++# Memory mapped GPIO drivers
++#
++# CONFIG_GPIO_74XX_MMIO is not set
++# CONFIG_GPIO_ALTERA is not set
++# CONFIG_GPIO_DWAPB is not set
++# CONFIG_GPIO_FTGPIO010 is not set
++CONFIG_GPIO_GENERIC_PLATFORM=y
++# CONFIG_GPIO_GRGPIO is not set
++# CONFIG_GPIO_HLWD is not set
++# CONFIG_GPIO_MB86S7X is not set
++# CONFIG_GPIO_MOCKUP is not set
++CONFIG_GPIO_PL061=y
++# CONFIG_GPIO_SYSCON is not set
++# CONFIG_GPIO_XGENE is not set
++# CONFIG_GPIO_XILINX is not set
++
++#
++# I2C GPIO expanders
++#
++# CONFIG_GPIO_ADP5588 is not set
++# CONFIG_GPIO_ADNP is not set
++# CONFIG_GPIO_MAX7300 is not set
++# CONFIG_GPIO_MAX732X is not set
++# CONFIG_GPIO_PCA953X is not set
++# CONFIG_GPIO_PCF857X is not set
++# CONFIG_GPIO_TPIC2810 is not set
++
++#
++# MFD GPIO expanders
++#
++
++#
++# PCI GPIO expanders
++#
++# CONFIG_GPIO_BT8XX is not set
++# CONFIG_GPIO_PCI_IDIO_16 is not set
++# CONFIG_GPIO_PCIE_IDIO_24 is not set
++# CONFIG_GPIO_RDC321X is not set
++
++#
++# SPI GPIO expanders
++#
++# CONFIG_GPIO_74X164 is not set
++# CONFIG_GPIO_MAX3191X is not set
++# CONFIG_GPIO_MAX7301 is not set
++# CONFIG_GPIO_MC33880 is not set
++# CONFIG_GPIO_PISOSR is not set
++# CONFIG_GPIO_XRA1403 is not set
++
++#
++# USB GPIO expanders
++#
++# CONFIG_W1 is not set
++# CONFIG_POWER_AVS is not set
++CONFIG_POWER_RESET=y
++# CONFIG_POWER_RESET_BRCMSTB is not set
++# CONFIG_POWER_RESET_GPIO is not set
++# CONFIG_POWER_RESET_GPIO_RESTART is not set
++# CONFIG_POWER_RESET_BSP is not set
++# CONFIG_POWER_RESET_LTC2952 is not set
++# CONFIG_POWER_RESET_RESTART is not set
++# CONFIG_POWER_RESET_XGENE is not set
++# CONFIG_POWER_RESET_SYSCON is not set
++# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set
++# CONFIG_SYSCON_REBOOT_MODE is not set
++CONFIG_POWER_SUPPLY=y
++# CONFIG_POWER_SUPPLY_DEBUG is not set
++# CONFIG_PDA_POWER is not set
++# CONFIG_TEST_POWER is not set
++# CONFIG_CHARGER_ADP5061 is not set
++# CONFIG_BATTERY_DS2780 is not set
++# CONFIG_BATTERY_DS2781 is not set
++# CONFIG_BATTERY_DS2782 is not set
++# CONFIG_BATTERY_SBS is not set
++# CONFIG_CHARGER_SBS is not set
++# CONFIG_MANAGER_SBS is not set
++# CONFIG_BATTERY_BQ27XXX is not set
++# CONFIG_BATTERY_MAX17040 is not set
++# CONFIG_BATTERY_MAX17042 is not set
++# CONFIG_CHARGER_MAX8903 is not set
++# CONFIG_CHARGER_LP8727 is not set
++# CONFIG_CHARGER_GPIO is not set
++# CONFIG_CHARGER_MANAGER is not set
++# CONFIG_CHARGER_LTC3651 is not set
++# CONFIG_CHARGER_DETECTOR_MAX14656 is not set
++# CONFIG_CHARGER_BQ2415X is not set
++# CONFIG_CHARGER_BQ24257 is not set
++# CONFIG_CHARGER_BQ24735 is not set
++# CONFIG_CHARGER_BQ25890 is not set
++# CONFIG_CHARGER_SMB347 is not set
++# CONFIG_BATTERY_GAUGE_LTC2941 is not set
++# CONFIG_CHARGER_RT9455 is not set
++# CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
++# CONFIG_WATCHDOG is not set
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
++CONFIG_BCMA_POSSIBLE=y
++# CONFIG_BCMA is not set
++
++#
++# Multifunction device drivers
++#
++CONFIG_MFD_CORE=y
++# CONFIG_MFD_ACT8945A is not set
++# CONFIG_MFD_AS3711 is not set
++# CONFIG_MFD_AS3722 is not set
++# CONFIG_PMIC_ADP5520 is not set
++# CONFIG_MFD_AAT2870_CORE is not set
++# CONFIG_MFD_ATMEL_FLEXCOM is not set
++# CONFIG_MFD_ATMEL_HLCDC is not set
++# CONFIG_MFD_BCM590XX is not set
++# CONFIG_MFD_BD9571MWV is not set
++# CONFIG_MFD_AXP20X_I2C is not set
++# CONFIG_MFD_CROS_EC is not set
++# CONFIG_MFD_MADERA is not set
++# CONFIG_PMIC_DA903X is not set
++# CONFIG_MFD_DA9052_SPI is not set
++# CONFIG_MFD_DA9052_I2C is not set
++# CONFIG_MFD_DA9055 is not set
++# CONFIG_MFD_DA9062 is not set
++# CONFIG_MFD_DA9063 is not set
++# CONFIG_MFD_DA9150 is not set
++# CONFIG_MFD_DLN2 is not set
++# CONFIG_MFD_MC13XXX_SPI is not set
++# CONFIG_MFD_MC13XXX_I2C is not set
++# CONFIG_MFD_HI6421_PMIC is not set
++CONFIG_MFD_BSP_FMC=y
++# CONFIG_HTC_PASIC3 is not set
++# CONFIG_HTC_I2CPLD is not set
++# CONFIG_LPC_ICH is not set
++# CONFIG_LPC_SCH is not set
++# CONFIG_MFD_JANZ_CMODIO is not set
++# CONFIG_MFD_KEMPLD is not set
++# CONFIG_MFD_88PM800 is not set
++# CONFIG_MFD_88PM805 is not set
++# CONFIG_MFD_88PM860X is not set
++# CONFIG_MFD_MAX14577 is not set
++# CONFIG_MFD_MAX77620 is not set
++# CONFIG_MFD_MAX77686 is not set
++# CONFIG_MFD_MAX77693 is not set
++# CONFIG_MFD_MAX77843 is not set
++# CONFIG_MFD_MAX8907 is not set
++# CONFIG_MFD_MAX8925 is not set
++# CONFIG_MFD_MAX8997 is not set
++# CONFIG_MFD_MAX8998 is not set
++# CONFIG_MFD_MT6397 is not set
++# CONFIG_MFD_MENF21BMC is not set
++# CONFIG_EZX_PCAP is not set
++# CONFIG_MFD_CPCAP is not set
++# CONFIG_MFD_VIPERBOARD is not set
++# CONFIG_MFD_RETU is not set
++# CONFIG_MFD_PCF50633 is not set
++# CONFIG_MFD_RDC321X is not set
++# CONFIG_MFD_RT5033 is not set
++# CONFIG_MFD_RC5T583 is not set
++# CONFIG_MFD_RK808 is not set
++# CONFIG_MFD_RN5T618 is not set
++# CONFIG_MFD_SEC_CORE is not set
++# CONFIG_MFD_SI476X_CORE is not set
++# CONFIG_MFD_SM501 is not set
++# CONFIG_MFD_SKY81452 is not set
++# CONFIG_MFD_SMSC is not set
++# CONFIG_ABX500_CORE is not set
++# CONFIG_MFD_STMPE is not set
++CONFIG_MFD_SYSCON=y
++# CONFIG_MFD_TI_AM335X_TSCADC is not set
++# CONFIG_MFD_LP3943 is not set
++# CONFIG_MFD_LP8788 is not set
++# CONFIG_MFD_TI_LMU is not set
++# CONFIG_MFD_PALMAS is not set
++# CONFIG_TPS6105X is not set
++# CONFIG_TPS65010 is not set
++# CONFIG_TPS6507X is not set
++# CONFIG_MFD_TPS65086 is not set
++# CONFIG_MFD_TPS65090 is not set
++# CONFIG_MFD_TPS65217 is not set
++# CONFIG_MFD_TI_LP873X is not set
++# CONFIG_MFD_TI_LP87565 is not set
++# CONFIG_MFD_TPS65218 is not set
++# CONFIG_MFD_TPS6586X is not set
++# CONFIG_MFD_TPS65910 is not set
++# CONFIG_MFD_TPS65912_I2C is not set
++# CONFIG_MFD_TPS65912_SPI is not set
++# CONFIG_MFD_TPS80031 is not set
++# CONFIG_TWL4030_CORE is not set
++# CONFIG_TWL6040_CORE is not set
++# CONFIG_MFD_WL1273_CORE is not set
++# CONFIG_MFD_LM3533 is not set
++# CONFIG_MFD_TC3589X is not set
++# CONFIG_MFD_VX855 is not set
++# CONFIG_MFD_ARIZONA_I2C is not set
++# CONFIG_MFD_ARIZONA_SPI is not set
++# CONFIG_MFD_WM8400 is not set
++# CONFIG_MFD_WM831X_I2C is not set
++# CONFIG_MFD_WM831X_SPI is not set
++# CONFIG_MFD_WM8350_I2C is not set
++# CONFIG_MFD_WM8994 is not set
++# CONFIG_MFD_ROHM_BD718XX is not set
++CONFIG_REGULATOR=y
++# CONFIG_REGULATOR_DEBUG is not set
++# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
++# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
++# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
++# CONFIG_REGULATOR_88PG86X is not set
++# CONFIG_REGULATOR_ACT8865 is not set
++# CONFIG_REGULATOR_AD5398 is not set
++# CONFIG_REGULATOR_ANATOP is not set
++# CONFIG_REGULATOR_DA9210 is not set
++# CONFIG_REGULATOR_DA9211 is not set
++# CONFIG_REGULATOR_FAN53555 is not set
++# CONFIG_REGULATOR_GPIO is not set
++# CONFIG_REGULATOR_ISL9305 is not set
++# CONFIG_REGULATOR_ISL6271A is not set
++# CONFIG_REGULATOR_LP3971 is not set
++# CONFIG_REGULATOR_LP3972 is not set
++# CONFIG_REGULATOR_LP872X is not set
++# CONFIG_REGULATOR_LP8755 is not set
++# CONFIG_REGULATOR_LTC3589 is not set
++# CONFIG_REGULATOR_LTC3676 is not set
++# CONFIG_REGULATOR_MAX1586 is not set
++# CONFIG_REGULATOR_MAX8649 is not set
++# CONFIG_REGULATOR_MAX8660 is not set
++# CONFIG_REGULATOR_MAX8952 is not set
++# CONFIG_REGULATOR_MT6311 is not set
++# CONFIG_REGULATOR_PFUZE100 is not set
++# CONFIG_REGULATOR_PV88060 is not set
++# CONFIG_REGULATOR_PV88080 is not set
++# CONFIG_REGULATOR_PV88090 is not set
++# CONFIG_REGULATOR_SY8106A is not set
++# CONFIG_REGULATOR_TPS51632 is not set
++# CONFIG_REGULATOR_TPS62360 is not set
++# CONFIG_REGULATOR_TPS65023 is not set
++# CONFIG_REGULATOR_TPS6507X is not set
++# CONFIG_REGULATOR_TPS65132 is not set
++# CONFIG_REGULATOR_TPS6524X is not set
++# CONFIG_REGULATOR_VCTRL is not set
++# CONFIG_RC_CORE is not set
++CONFIG_MEDIA_SUPPORT=y
++
++#
++# Multimedia core support
++#
++CONFIG_MEDIA_CAMERA_SUPPORT=y
++# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set
++# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set
++# CONFIG_MEDIA_RADIO_SUPPORT is not set
++# CONFIG_MEDIA_SDR_SUPPORT is not set
++# CONFIG_MEDIA_CEC_SUPPORT is not set
++# CONFIG_MEDIA_CONTROLLER is not set
++CONFIG_VIDEO_DEV=y
++CONFIG_VIDEO_V4L2=y
++# CONFIG_VIDEO_ADV_DEBUG is not set
++# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
++
++#
++# Media drivers
++#
++CONFIG_MEDIA_USB_SUPPORT=y
++
++#
++# Webcam devices
++#
++CONFIG_USB_VIDEO_CLASS=y
++CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
++CONFIG_USB_GSPCA=m
++# CONFIG_USB_M5602 is not set
++# CONFIG_USB_STV06XX is not set
++# CONFIG_USB_GL860 is not set
++# CONFIG_USB_GSPCA_BENQ is not set
++# CONFIG_USB_GSPCA_CONEX is not set
++# CONFIG_USB_GSPCA_CPIA1 is not set
++# CONFIG_USB_GSPCA_DTCS033 is not set
++# CONFIG_USB_GSPCA_ETOMS is not set
++# CONFIG_USB_GSPCA_FINEPIX is not set
++# CONFIG_USB_GSPCA_JEILINJ is not set
++# CONFIG_USB_GSPCA_JL2005BCD is not set
++# CONFIG_USB_GSPCA_KINECT is not set
++# CONFIG_USB_GSPCA_KONICA is not set
++# CONFIG_USB_GSPCA_MARS is not set
++# CONFIG_USB_GSPCA_MR97310A is not set
++# CONFIG_USB_GSPCA_NW80X is not set
++# CONFIG_USB_GSPCA_OV519 is not set
++# CONFIG_USB_GSPCA_OV534 is not set
++# CONFIG_USB_GSPCA_OV534_9 is not set
++# CONFIG_USB_GSPCA_PAC207 is not set
++# CONFIG_USB_GSPCA_PAC7302 is not set
++# CONFIG_USB_GSPCA_PAC7311 is not set
++# CONFIG_USB_GSPCA_SE401 is not set
++# CONFIG_USB_GSPCA_SN9C2028 is not set
++# CONFIG_USB_GSPCA_SN9C20X is not set
++# CONFIG_USB_GSPCA_SONIXB is not set
++# CONFIG_USB_GSPCA_SONIXJ is not set
++# CONFIG_USB_GSPCA_SPCA500 is not set
++# CONFIG_USB_GSPCA_SPCA501 is not set
++# CONFIG_USB_GSPCA_SPCA505 is not set
++# CONFIG_USB_GSPCA_SPCA506 is not set
++# CONFIG_USB_GSPCA_SPCA508 is not set
++# CONFIG_USB_GSPCA_SPCA561 is not set
++# CONFIG_USB_GSPCA_SPCA1528 is not set
++# CONFIG_USB_GSPCA_SQ905 is not set
++# CONFIG_USB_GSPCA_SQ905C is not set
++# CONFIG_USB_GSPCA_SQ930X is not set
++# CONFIG_USB_GSPCA_STK014 is not set
++# CONFIG_USB_GSPCA_STK1135 is not set
++# CONFIG_USB_GSPCA_STV0680 is not set
++# CONFIG_USB_GSPCA_SUNPLUS is not set
++# CONFIG_USB_GSPCA_T613 is not set
++# CONFIG_USB_GSPCA_TOPRO is not set
++# CONFIG_USB_GSPCA_TOUPTEK is not set
++# CONFIG_USB_GSPCA_TV8532 is not set
++# CONFIG_USB_GSPCA_VC032X is not set
++# CONFIG_USB_GSPCA_VICAM is not set
++# CONFIG_USB_GSPCA_XIRLINK_CIT is not set
++# CONFIG_USB_GSPCA_ZC3XX is not set
++# CONFIG_USB_PWC is not set
++# CONFIG_VIDEO_CPIA2 is not set
++# CONFIG_USB_ZR364XX is not set
++# CONFIG_USB_STKWEBCAM is not set
++# CONFIG_USB_S2255 is not set
++# CONFIG_VIDEO_USBTV is not set
++
++#
++# Webcam, TV (analog/digital) USB devices
++#
++# CONFIG_VIDEO_EM28XX is not set
++# CONFIG_MEDIA_PCI_SUPPORT is not set
++CONFIG_V4L_PLATFORM_DRIVERS=y
++# CONFIG_VIDEO_CAFE_CCIC is not set
++# CONFIG_VIDEO_CADENCE is not set
++# CONFIG_SOC_CAMERA is not set
++# CONFIG_V4L_MEM2MEM_DRIVERS is not set
++# CONFIG_V4L_TEST_DRIVERS is not set
++
++#
++# Supported MMC/SDIO adapters
++#
++# CONFIG_CYPRESS_FIRMWARE is not set
++CONFIG_VIDEOBUF2_CORE=y
++CONFIG_VIDEOBUF2_V4L2=y
++CONFIG_VIDEOBUF2_MEMOPS=y
++CONFIG_VIDEOBUF2_VMALLOC=y
++
++#
++# Media ancillary drivers (tuners, sensors, i2c, spi, frontends)
++#
++CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
++
++#
++# Audio decoders, processors and mixers
++#
++
++#
++# RDS decoders
++#
++
++#
++# Video decoders
++#
++
++#
++# Video and audio decoders
++#
++
++#
++# Video encoders
++#
++
++#
++# Camera sensor devices
++#
++
++#
++# Flash devices
++#
++
++#
++# Video improvement chips
++#
++
++#
++# Audio/Video compression chips
++#
++
++#
++# SDR tuner chips
++#
++
++#
++# Miscellaneous helper chips
++#
++
++#
++# Sensors used on soc_camera driver
++#
++
++#
++# Media SPI Adapters
++#
++
++#
++# Tools to develop new frontends
++#
++
++#
++# Graphics support
++#
++CONFIG_VGA_ARB=y
++CONFIG_VGA_ARB_MAX_GPUS=16
++# CONFIG_DRM is not set
++# CONFIG_DRM_DP_CEC is not set
++
++#
++# ACP (Audio CoProcessor) Configuration
++#
++
++#
++# AMD Library routines
++#
++
++#
++# Frame buffer Devices
++#
++CONFIG_FB_CMDLINE=y
++CONFIG_FB_NOTIFY=y
++CONFIG_FB=y
++# CONFIG_FIRMWARE_EDID is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
++# CONFIG_FB_MODE_HELPERS is not set
++# CONFIG_FB_TILEBLITTING is not set
++
++#
++# Frame buffer hardware drivers
++#
++# CONFIG_FB_CIRRUS is not set
++# CONFIG_FB_PM2 is not set
++# CONFIG_FB_ARMCLCD is not set
++# CONFIG_FB_CYBER2000 is not set
++# CONFIG_FB_ASILIANT is not set
++# CONFIG_FB_IMSTT is not set
++# CONFIG_FB_OPENCORES is not set
++# CONFIG_FB_S1D13XXX is not set
++# CONFIG_FB_NVIDIA is not set
++# CONFIG_FB_RIVA is not set
++# CONFIG_FB_I740 is not set
++# CONFIG_FB_MATROX is not set
++# CONFIG_FB_RADEON is not set
++# CONFIG_FB_ATY128 is not set
++# CONFIG_FB_ATY is not set
++# CONFIG_FB_S3 is not set
++# CONFIG_FB_SAVAGE is not set
++# CONFIG_FB_SIS is not set
++# CONFIG_FB_NEOMAGIC is not set
++# CONFIG_FB_KYRO is not set
++# CONFIG_FB_3DFX is not set
++# CONFIG_FB_VOODOO1 is not set
++# CONFIG_FB_VT8623 is not set
++# CONFIG_FB_TRIDENT is not set
++# CONFIG_FB_ARK is not set
++# CONFIG_FB_PM3 is not set
++# CONFIG_FB_CARMINE is not set
++# CONFIG_FB_SMSCUFX is not set
++# CONFIG_FB_UDL is not set
++# CONFIG_FB_IBM_GXT4500 is not set
++# CONFIG_FB_VIRTUAL is not set
++# CONFIG_FB_METRONOME is not set
++# CONFIG_FB_MB862XX is not set
++# CONFIG_FB_BROADSHEET is not set
++# CONFIG_FB_SIMPLE is not set
++# CONFIG_FB_SSD1307 is not set
++# CONFIG_FB_SM712 is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Console display driver support
++#
++CONFIG_DUMMY_CONSOLE=y
++CONFIG_DUMMY_CONSOLE_COLUMNS=80
++CONFIG_DUMMY_CONSOLE_ROWS=25
++# CONFIG_FRAMEBUFFER_CONSOLE is not set
++# CONFIG_LOGO is not set
++CONFIG_SOUND=y
++CONFIG_SND=y
++CONFIG_SND_TIMER=y
++CONFIG_SND_PCM=y
++# CONFIG_SND_OSSEMUL is not set
++CONFIG_SND_PCM_TIMER=y
++# CONFIG_SND_DYNAMIC_MINORS is not set
++CONFIG_SND_SUPPORT_OLD_API=y
++CONFIG_SND_PROC_FS=y
++CONFIG_SND_VERBOSE_PROCFS=y
++# CONFIG_SND_VERBOSE_PRINTK is not set
++# CONFIG_SND_DEBUG is not set
++# CONFIG_SND_SEQUENCER is not set
++CONFIG_SND_DRIVERS=y
++# CONFIG_SND_DUMMY is not set
++# CONFIG_SND_ALOOP is not set
++# CONFIG_SND_MTPAV is not set
++# CONFIG_SND_SERIAL_U16550 is not set
++# CONFIG_SND_MPU401 is not set
++CONFIG_SND_PCI=y
++# CONFIG_SND_AD1889 is not set
++# CONFIG_SND_ATIIXP is not set
++# CONFIG_SND_ATIIXP_MODEM is not set
++# CONFIG_SND_AU8810 is not set
++# CONFIG_SND_AU8820 is not set
++# CONFIG_SND_AU8830 is not set
++# CONFIG_SND_AW2 is not set
++# CONFIG_SND_BT87X is not set
++# CONFIG_SND_CA0106 is not set
++# CONFIG_SND_CMIPCI is not set
++# CONFIG_SND_OXYGEN is not set
++# CONFIG_SND_CS4281 is not set
++# CONFIG_SND_CS46XX is not set
++# CONFIG_SND_CTXFI is not set
++# CONFIG_SND_DARLA20 is not set
++# CONFIG_SND_GINA20 is not set
++# CONFIG_SND_LAYLA20 is not set
++# CONFIG_SND_DARLA24 is not set
++# CONFIG_SND_GINA24 is not set
++# CONFIG_SND_LAYLA24 is not set
++# CONFIG_SND_MONA is not set
++# CONFIG_SND_MIA is not set
++# CONFIG_SND_ECHO3G is not set
++# CONFIG_SND_INDIGO is not set
++# CONFIG_SND_INDIGOIO is not set
++# CONFIG_SND_INDIGODJ is not set
++# CONFIG_SND_INDIGOIOX is not set
++# CONFIG_SND_INDIGODJX is not set
++# CONFIG_SND_ENS1370 is not set
++# CONFIG_SND_ENS1371 is not set
++# CONFIG_SND_FM801 is not set
++# CONFIG_SND_HDSP is not set
++# CONFIG_SND_HDSPM is not set
++# CONFIG_SND_ICE1724 is not set
++# CONFIG_SND_INTEL8X0 is not set
++# CONFIG_SND_INTEL8X0M is not set
++# CONFIG_SND_KORG1212 is not set
++# CONFIG_SND_LOLA is not set
++# CONFIG_SND_LX6464ES is not set
++# CONFIG_SND_MIXART is not set
++# CONFIG_SND_NM256 is not set
++# CONFIG_SND_PCXHR is not set
++# CONFIG_SND_RIPTIDE is not set
++# CONFIG_SND_RME32 is not set
++# CONFIG_SND_RME96 is not set
++# CONFIG_SND_RME9652 is not set
++# CONFIG_SND_SE6X is not set
++# CONFIG_SND_VIA82XX is not set
++# CONFIG_SND_VIA82XX_MODEM is not set
++# CONFIG_SND_VIRTUOSO is not set
++# CONFIG_SND_VX222 is not set
++# CONFIG_SND_YMFPCI is not set
++
++#
++# HD-Audio
++#
++# CONFIG_SND_HDA_INTEL is not set
++CONFIG_SND_HDA_PREALLOC_SIZE=64
++CONFIG_SND_SPI=y
++CONFIG_SND_USB=y
++# CONFIG_SND_USB_AUDIO is not set
++# CONFIG_SND_USB_UA101 is not set
++# CONFIG_SND_USB_CAIAQ is not set
++# CONFIG_SND_USB_6FIRE is not set
++# CONFIG_SND_USB_HIFACE is not set
++# CONFIG_SND_BCD2000 is not set
++# CONFIG_SND_USB_POD is not set
++# CONFIG_SND_USB_PODHD is not set
++# CONFIG_SND_USB_TONEPORT is not set
++# CONFIG_SND_USB_VARIAX is not set
++# CONFIG_SND_SOC is not set
++
++#
++# HID support
++#
++CONFIG_HID=y
++# CONFIG_HID_BATTERY_STRENGTH is not set
++# CONFIG_HIDRAW is not set
++# CONFIG_UHID is not set
++CONFIG_HID_GENERIC=y
++
++#
++# Special HID drivers
++#
++CONFIG_HID_A4TECH=y
++# CONFIG_HID_ACCUTOUCH is not set
++# CONFIG_HID_ACRUX is not set
++CONFIG_HID_APPLE=y
++# CONFIG_HID_APPLEIR is not set
++# CONFIG_HID_AUREAL is not set
++CONFIG_HID_BELKIN=y
++# CONFIG_HID_BETOP_FF is not set
++CONFIG_HID_CHERRY=y
++CONFIG_HID_CHICONY=y
++# CONFIG_HID_COUGAR is not set
++# CONFIG_HID_PRODIKEYS is not set
++# CONFIG_HID_CMEDIA is not set
++CONFIG_HID_CYPRESS=y
++# CONFIG_HID_DRAGONRISE is not set
++# CONFIG_HID_EMS_FF is not set
++# CONFIG_HID_ELECOM is not set
++# CONFIG_HID_ELO is not set
++CONFIG_HID_EZKEY=y
++# CONFIG_HID_GEMBIRD is not set
++# CONFIG_HID_GFRM is not set
++# CONFIG_HID_HOLTEK is not set
++# CONFIG_HID_KEYTOUCH is not set
++# CONFIG_HID_KYE is not set
++# CONFIG_HID_UCLOGIC is not set
++# CONFIG_HID_WALTOP is not set
++# CONFIG_HID_GYRATION is not set
++# CONFIG_HID_ICADE is not set
++# CONFIG_HID_ITE is not set
++# CONFIG_HID_JABRA is not set
++# CONFIG_HID_TWINHAN is not set
++CONFIG_HID_KENSINGTON=y
++# CONFIG_HID_LCPOWER is not set
++# CONFIG_HID_LENOVO is not set
++CONFIG_HID_LOGITECH=y
++# CONFIG_HID_LOGITECH_HIDPP is not set
++# CONFIG_LOGITECH_FF is not set
++# CONFIG_LOGIRUMBLEPAD2_FF is not set
++# CONFIG_LOGIG940_FF is not set
++# CONFIG_LOGIWHEELS_FF is not set
++# CONFIG_HID_MAGICMOUSE is not set
++# CONFIG_HID_MAYFLASH is not set
++# CONFIG_HID_REDRAGON is not set
++CONFIG_HID_MICROSOFT=y
++CONFIG_HID_MONTEREY=y
++# CONFIG_HID_MULTITOUCH is not set
++# CONFIG_HID_NTI is not set
++# CONFIG_HID_NTRIG is not set
++# CONFIG_HID_ORTEK is not set
++# CONFIG_HID_PANTHERLORD is not set
++# CONFIG_HID_PENMOUNT is not set
++# CONFIG_HID_PETALYNX is not set
++# CONFIG_HID_PICOLCD is not set
++# CONFIG_HID_PLANTRONICS is not set
++# CONFIG_HID_PRIMAX is not set
++# CONFIG_HID_RETRODE is not set
++# CONFIG_HID_ROCCAT is not set
++# CONFIG_HID_SAITEK is not set
++# CONFIG_HID_SAMSUNG is not set
++# CONFIG_HID_SPEEDLINK is not set
++# CONFIG_HID_STEAM is not set
++# CONFIG_HID_STEELSERIES is not set
++# CONFIG_HID_SUNPLUS is not set
++# CONFIG_HID_RMI is not set
++# CONFIG_HID_GREENASIA is not set
++# CONFIG_HID_SMARTJOYPLUS is not set
++# CONFIG_HID_TIVO is not set
++# CONFIG_HID_TOPSEED is not set
++# CONFIG_HID_THRUSTMASTER is not set
++# CONFIG_HID_UDRAW_PS3 is not set
++# CONFIG_HID_WACOM is not set
++# CONFIG_HID_XINMO is not set
++# CONFIG_HID_ZEROPLUS is not set
++# CONFIG_HID_ZYDACRON is not set
++# CONFIG_HID_SENSOR_HUB is not set
++# CONFIG_HID_ALPS is not set
++
++#
++# USB HID support
++#
++CONFIG_USB_HID=y
++# CONFIG_HID_PID is not set
++# CONFIG_USB_HIDDEV is not set
++
++#
++# I2C HID support
++#
++# CONFIG_I2C_HID is not set
++CONFIG_USB_OHCI_LITTLE_ENDIAN=y
++CONFIG_USB_SUPPORT=y
++CONFIG_USB_COMMON=y
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB=y
++CONFIG_USB_PCI=y
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
++
++#
++# Miscellaneous USB options
++#
++CONFIG_USB_DEFAULT_PERSIST=y
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_OTG is not set
++# CONFIG_USB_OTG_WHITELIST is not set
++# CONFIG_USB_OTG_BLACKLIST_HUB is not set
++# CONFIG_USB_MON is not set
++# CONFIG_USB_WUSB_CBAF is not set
++
++#
++# USB Host Controller Drivers
++#
++# CONFIG_USB_C67X00_HCD is not set
++CONFIG_USB_XHCI_HCD=y
++# CONFIG_USB_XHCI_DBGCAP is not set
++CONFIG_USB_XHCI_PCI=y
++CONFIG_USB_XHCI_PLATFORM=y
++# CONFIG_USB_EHCI_HCD is not set
++# CONFIG_USB_OXU210HP_HCD is not set
++# CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_FOTG210_HCD is not set
++# CONFIG_USB_MAX3421_HCD is not set
++# CONFIG_USB_OHCI_HCD is not set
++# CONFIG_USB_UHCI_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++# CONFIG_USB_HCD_TEST_MODE is not set
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
++# CONFIG_USB_WDM is not set
++# CONFIG_USB_TMC is not set
++
++#
++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
++#
++
++#
++# also be needed; see USB_STORAGE Help for more info
++#
++CONFIG_USB_STORAGE=y
++# CONFIG_USB_STORAGE_DEBUG is not set
++# CONFIG_USB_STORAGE_REALTEK is not set
++# CONFIG_USB_STORAGE_DATAFAB is not set
++# CONFIG_USB_STORAGE_FREECOM is not set
++# CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_USBAT is not set
++# CONFIG_USB_STORAGE_SDDR09 is not set
++# CONFIG_USB_STORAGE_SDDR55 is not set
++# CONFIG_USB_STORAGE_JUMPSHOT is not set
++# CONFIG_USB_STORAGE_ALAUDA is not set
++# CONFIG_USB_STORAGE_ONETOUCH is not set
++# CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
++# CONFIG_USB_STORAGE_ENE_UB6250 is not set
++# CONFIG_USB_UAS is not set
++
++#
++# USB Imaging devices
++#
++# CONFIG_USB_MDC800 is not set
++# CONFIG_USB_MICROTEK is not set
++# CONFIG_USBIP_CORE is not set
++# CONFIG_USB_MUSB_HDRC is not set
++CONFIG_USB_DWC3=y
++# CONFIG_USB_DWC3_HOST is not set
++CONFIG_USB_DWC3_GADGET=y
++
++#
++# Platform Glue Driver Support
++#
++# CONFIG_USB_DWC3_HAPS is not set
++# CONFIG_USB_DWC3_OF_SIMPLE is not set
++# CONFIG_USB_DWC2 is not set
++# CONFIG_USB_CHIPIDEA is not set
++# CONFIG_USB_ISP1760 is not set
++
++#
++# USB port drivers
++#
++# CONFIG_USB_SERIAL is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_SEVSEG is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
++# CONFIG_USB_TEST is not set
++# CONFIG_USB_EHSET_TEST_FIXTURE is not set
++# CONFIG_USB_ISIGHTFW is not set
++# CONFIG_USB_YUREX is not set
++# CONFIG_USB_EZUSB_FX2 is not set
++# CONFIG_USB_HUB_USB251XB is not set
++# CONFIG_USB_HSIC_USB3503 is not set
++# CONFIG_USB_HSIC_USB4604 is not set
++# CONFIG_USB_LINK_LAYER_TEST is not set
++
++#
++# USB Physical Layer drivers
++#
++# CONFIG_NOP_USB_XCEIV is not set
++# CONFIG_USB_GPIO_VBUS is not set
++# CONFIG_USB_ISP1301 is not set
++# CONFIG_USB_ULPI is not set
++CONFIG_USB_GADGET=y
++# CONFIG_USB_GADGET_DEBUG is not set
++# CONFIG_USB_GADGET_DEBUG_FILES is not set
++CONFIG_USB_GADGET_VBUS_DRAW=2
++CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
++# CONFIG_U_SERIAL_CONSOLE is not set
++
++#
++# USB Peripheral Controller
++#
++# CONFIG_USB_FOTG210_UDC is not set
++# CONFIG_USB_GR_UDC is not set
++# CONFIG_USB_R8A66597 is not set
++# CONFIG_USB_PXA27X is not set
++# CONFIG_USB_MV_UDC is not set
++# CONFIG_USB_MV_U3D is not set
++# CONFIG_USB_SNP_UDC_PLAT is not set
++# CONFIG_USB_M66592 is not set
++# CONFIG_USB_BDC_UDC is not set
++# CONFIG_USB_AMD5536UDC is not set
++# CONFIG_USB_NET2272 is not set
++# CONFIG_USB_NET2280 is not set
++# CONFIG_USB_GOKU is not set
++# CONFIG_USB_EG20T is not set
++# CONFIG_USB_GADGET_XILINX is not set
++# CONFIG_USB_DUMMY_HCD is not set
++CONFIG_USB_LIBCOMPOSITE=y
++CONFIG_USB_F_ACM=y
++CONFIG_USB_U_SERIAL=y
++CONFIG_USB_U_ETHER=y
++CONFIG_USB_U_AUDIO=y
++CONFIG_USB_F_RNDIS=y
++CONFIG_USB_F_MASS_STORAGE=y
++CONFIG_USB_F_UAC1=y
++CONFIG_USB_F_UVC=y
++CONFIG_USB_CONFIGFS=y
++# CONFIG_USB_CONFIGFS_SERIAL is not set
++CONFIG_USB_CONFIGFS_ACM=y
++# CONFIG_USB_CONFIGFS_OBEX is not set
++# CONFIG_USB_CONFIGFS_NCM is not set
++# CONFIG_USB_CONFIGFS_ECM is not set
++# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set
++CONFIG_USB_CONFIGFS_RNDIS=y
++# CONFIG_USB_CONFIGFS_EEM is not set
++CONFIG_USB_CONFIGFS_MASS_STORAGE=y
++# CONFIG_USB_CONFIGFS_F_LB_SS is not set
++# CONFIG_USB_CONFIGFS_F_FS is not set
++CONFIG_USB_CONFIGFS_F_UAC1=y
++# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set
++# CONFIG_USB_CONFIGFS_F_UAC2 is not set
++# CONFIG_USB_CONFIGFS_F_MIDI is not set
++# CONFIG_USB_CONFIGFS_F_HID is not set
++CONFIG_USB_CONFIGFS_F_UVC=y
++# CONFIG_USB_CONFIGFS_F_PRINTER is not set
++CONFIG_MPP_TO_GADGET_UVC=y
++# CONFIG_TYPEC is not set
++# CONFIG_USB_ROLE_SWITCH is not set
++# CONFIG_USB_ULPI_BUS is not set
++# CONFIG_UWB is not set
++CONFIG_MMC=y
++CONFIG_PWRSEQ_EMMC=y
++CONFIG_PWRSEQ_SIMPLE=y
++CONFIG_MMC_BLOCK=y
++CONFIG_MMC_BLOCK_MINORS=8
++# CONFIG_SDIO_UART is not set
++# CONFIG_MMC_TEST is not set
++
++#
++# MMC/SD/SDIO Host Controller Drivers
++#
++# CONFIG_MMC_DEBUG is not set
++# CONFIG_MMC_ARMMMCI is not set
++CONFIG_MMC_SDHCI=y
++CONFIG_MMC_SDHCI_IO_ACCESSORS=y
++# CONFIG_MMC_SDHCI_PCI is not set
++CONFIG_MMC_SDHCI_PLTFM=y
++# CONFIG_MMC_SDHCI_OF_ARASAN is not set
++# CONFIG_MMC_SDHCI_OF_AT91 is not set
++# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set
++# CONFIG_MMC_SDHCI_CADENCE is not set
++CONFIG_MMC_SDHCI_BSP=y
++# CONFIG_MMC_SDHCI_F_SDH30 is not set
++# CONFIG_MMC_TIFM_SD is not set
++# CONFIG_MMC_SPI is not set
++# CONFIG_MMC_CB710 is not set
++# CONFIG_MMC_VIA_SDMMC is not set
++# CONFIG_MMC_DW is not set
++# CONFIG_MMC_VUB300 is not set
++# CONFIG_MMC_USHC is not set
++# CONFIG_MMC_USDHI6ROL0 is not set
++# CONFIG_MMC_CQHCI is not set
++# CONFIG_MMC_TOSHIBA_PCI is not set
++# CONFIG_MMC_MTK is not set
++# CONFIG_MMC_SDHCI_XENON is not set
++# CONFIG_MMC_SDHCI_OMAP is not set
++# CONFIG_MMC_CQ_HCI is not set
++# CONFIG_MEMSTICK is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_ACCESSIBILITY is not set
++# CONFIG_INFINIBAND is not set
++CONFIG_EDAC_SUPPORT=y
++CONFIG_RTC_LIB=y
++CONFIG_RTC_CLASS=y
++CONFIG_RTC_HCTOSYS=y
++CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
++CONFIG_RTC_SYSTOHC=y
++CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
++# CONFIG_RTC_DEBUG is not set
++CONFIG_RTC_NVMEM=y
++
++#
++# RTC interfaces
++#
++CONFIG_RTC_INTF_SYSFS=y
++CONFIG_RTC_INTF_PROC=y
++CONFIG_RTC_INTF_DEV=y
++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
++# CONFIG_RTC_DRV_TEST is not set
++
++#
++# I2C RTC drivers
++#
++# CONFIG_RTC_DRV_ABB5ZES3 is not set
++# CONFIG_RTC_DRV_ABX80X is not set
++# CONFIG_RTC_DRV_DS1307 is not set
++# CONFIG_RTC_DRV_DS1374 is not set
++# CONFIG_RTC_DRV_DS1672 is not set
++# CONFIG_RTC_DRV_HYM8563 is not set
++# CONFIG_RTC_DRV_MAX6900 is not set
++# CONFIG_RTC_DRV_RS5C372 is not set
++# CONFIG_RTC_DRV_ISL1208 is not set
++# CONFIG_RTC_DRV_ISL12022 is not set
++# CONFIG_RTC_DRV_ISL12026 is not set
++# CONFIG_RTC_DRV_X1205 is not set
++# CONFIG_RTC_DRV_PCF8523 is not set
++# CONFIG_RTC_DRV_PCF85063 is not set
++# CONFIG_RTC_DRV_PCF85363 is not set
++# CONFIG_RTC_DRV_PCF8563 is not set
++# CONFIG_RTC_DRV_PCF8583 is not set
++# CONFIG_RTC_DRV_M41T80 is not set
++# CONFIG_RTC_DRV_BQ32K is not set
++# CONFIG_RTC_DRV_S35390A is not set
++# CONFIG_RTC_DRV_FM3130 is not set
++# CONFIG_RTC_DRV_RX8010 is not set
++# CONFIG_RTC_DRV_RX8581 is not set
++# CONFIG_RTC_DRV_RX8025 is not set
++# CONFIG_RTC_DRV_EM3027 is not set
++# CONFIG_RTC_DRV_RV8803 is not set
++
++#
++# SPI RTC drivers
++#
++# CONFIG_RTC_DRV_M41T93 is not set
++# CONFIG_RTC_DRV_M41T94 is not set
++# CONFIG_RTC_DRV_DS1302 is not set
++# CONFIG_RTC_DRV_DS1305 is not set
++# CONFIG_RTC_DRV_DS1343 is not set
++# CONFIG_RTC_DRV_DS1347 is not set
++# CONFIG_RTC_DRV_DS1390 is not set
++# CONFIG_RTC_DRV_MAX6916 is not set
++# CONFIG_RTC_DRV_R9701 is not set
++# CONFIG_RTC_DRV_RX4581 is not set
++# CONFIG_RTC_DRV_RX6110 is not set
++# CONFIG_RTC_DRV_RS5C348 is not set
++# CONFIG_RTC_DRV_MAX6902 is not set
++# CONFIG_RTC_DRV_PCF2123 is not set
++# CONFIG_RTC_DRV_MCP795 is not set
++CONFIG_RTC_I2C_AND_SPI=y
++
++#
++# SPI and I2C RTC drivers
++#
++# CONFIG_RTC_DRV_DS3232 is not set
++# CONFIG_RTC_DRV_PCF2127 is not set
++# CONFIG_RTC_DRV_RV3029C2 is not set
++
++#
++# Platform RTC drivers
++#
++# CONFIG_RTC_DRV_BSP is not set
++# CONFIG_RTC_DRV_DS1286 is not set
++# CONFIG_RTC_DRV_DS1511 is not set
++# CONFIG_RTC_DRV_DS1553 is not set
++# CONFIG_RTC_DRV_DS1685_FAMILY is not set
++# CONFIG_RTC_DRV_DS1742 is not set
++# CONFIG_RTC_DRV_DS2404 is not set
++# CONFIG_RTC_DRV_STK17TA8 is not set
++# CONFIG_RTC_DRV_M48T86 is not set
++# CONFIG_RTC_DRV_M48T35 is not set
++# CONFIG_RTC_DRV_M48T59 is not set
++# CONFIG_RTC_DRV_MSM6242 is not set
++# CONFIG_RTC_DRV_BQ4802 is not set
++# CONFIG_RTC_DRV_RP5C01 is not set
++# CONFIG_RTC_DRV_V3020 is not set
++# CONFIG_RTC_DRV_ZYNQMP is not set
++
++#
++# on-CPU RTC drivers
++#
++# CONFIG_RTC_DRV_PL030 is not set
++# CONFIG_RTC_DRV_PL031 is not set
++# CONFIG_RTC_DRV_FTRTC010 is not set
++# CONFIG_RTC_DRV_SNVS is not set
++# CONFIG_RTC_DRV_R7301 is not set
++
++#
++# HID Sensor RTC drivers
++#
++# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set
++CONFIG_DMADEVICES=y
++# CONFIG_DMADEVICES_DEBUG is not set
++
++#
++# DMA Devices
++#
++CONFIG_DMA_ENGINE=y
++CONFIG_DMA_VIRTUAL_CHANNELS=y
++CONFIG_DMA_OF=y
++# CONFIG_ALTERA_MSGDMA is not set
++# CONFIG_AMBA_PL08X is not set
++# CONFIG_DW_AXI_DMAC is not set
++# CONFIG_FSL_EDMA is not set
++# CONFIG_INTEL_IDMA64 is not set
++CONFIG_EDMACV310=y
++# CONFIG_MV_XOR_V2 is not set
++# CONFIG_PL330_DMA is not set
++# CONFIG_XILINX_DMA is not set
++# CONFIG_XILINX_ZYNQMP_DMA is not set
++# CONFIG_QCOM_HIDMA_MGMT is not set
++# CONFIG_QCOM_HIDMA is not set
++# CONFIG_DW_DMAC is not set
++# CONFIG_DW_DMAC_PCI is not set
++
++#
++# DMA Clients
++#
++# CONFIG_ASYNC_TX_DMA is not set
++# CONFIG_DMATEST is not set
++
++#
++# DMABUF options
++#
++# CONFIG_SYNC_FILE is not set
++# CONFIG_AUXDISPLAY is not set
++# CONFIG_UIO is not set
++# CONFIG_VFIO is not set
++# CONFIG_VIRT_DRIVERS is not set
++# CONFIG_VIRTIO_MENU is not set
++
++#
++# Microsoft Hyper-V guest support
++#
++# CONFIG_STAGING is not set
++# CONFIG_GOLDFISH is not set
++# CONFIG_CHROME_PLATFORMS is not set
++CONFIG_CLKDEV_LOOKUP=y
++CONFIG_HAVE_CLK_PREPARE=y
++CONFIG_COMMON_CLK=y
++
++#
++# Common Clock Framework
++#
++# CONFIG_COMMON_CLK_VERSATILE is not set
++# CONFIG_CLK_HSDK is not set
++# CONFIG_COMMON_CLK_MAX9485 is not set
++# CONFIG_COMMON_CLK_SI5351 is not set
++# CONFIG_COMMON_CLK_SI514 is not set
++# CONFIG_COMMON_CLK_SI544 is not set
++# CONFIG_COMMON_CLK_SI570 is not set
++# CONFIG_COMMON_CLK_CDCE706 is not set
++# CONFIG_COMMON_CLK_CDCE925 is not set
++# CONFIG_COMMON_CLK_CS2000_CP is not set
++# CONFIG_CLK_QORIQ is not set
++# CONFIG_COMMON_CLK_XGENE is not set
++# CONFIG_COMMON_CLK_VC5 is not set
++CONFIG_COMMON_CLK_SS928V100=y
++CONFIG_RESET_BSP=y
++# CONFIG_HWSPINLOCK is not set
++
++#
++# Clock Source drivers
++#
++CONFIG_TIMER_OF=y
++CONFIG_TIMER_PROBE=y
++CONFIG_CLKSRC_MMIO=y
++CONFIG_ARM_ARCH_TIMER=y
++CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
++CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y
++# CONFIG_ARM_ARCH_TIMER_VCT_ACCESS is not set
++# CONFIG_FSL_ERRATUM_A008585 is not set
++CONFIG_HISILICON_ERRATUM_161010101=y
++CONFIG_ARM64_ERRATUM_858921=y
++CONFIG_ARM_TIMER_SP804=y
++# CONFIG_TIMER_BSP_SP804 is not set
++# CONFIG_MAILBOX is not set
++CONFIG_IOMMU_API=y
++CONFIG_IOMMU_SUPPORT=y
++
++#
++# Generic IOMMU Pagetable Support
++#
++CONFIG_IOMMU_IO_PGTABLE=y
++CONFIG_IOMMU_IO_PGTABLE_LPAE=y
++# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set
++# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set
++
++#
++# Generic PASID table support
++#
++CONFIG_IOMMU_PASID_TABLE=y
++CONFIG_ARM_SMMU_V3_CONTEXT=y
++# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
++CONFIG_IOMMU_IOVA=y
++CONFIG_OF_IOMMU=y
++CONFIG_IOMMU_DMA=y
++CONFIG_IOMMU_SVA=y
++CONFIG_IOMMU_PAGE_FAULT=y
++# CONFIG_ARM_SMMU is not set
++CONFIG_ARM_SMMU_V3=y
++
++#
++# Remoteproc drivers
++#
++# CONFIG_REMOTEPROC is not set
++
++#
++# Rpmsg drivers
++#
++# CONFIG_RPMSG_VIRTIO is not set
++
++#
++# SOC (System On Chip) specific Drivers
++#
++
++#
++# Amlogic SoC drivers
++#
++
++#
++# Broadcom SoC drivers
++#
++# CONFIG_SOC_BRCMSTB is not set
++
++#
++# NXP/Freescale QorIQ SoC drivers
++#
++
++#
++# i.MX SoC drivers
++#
++
++#
++# Qualcomm SoC drivers
++#
++# CONFIG_SOC_TI is not set
++
++#
++# Xilinx SoC drivers
++#
++# CONFIG_XILINX_VCU is not set
++CONFIG_PM_DEVFREQ=y
++
++#
++# DEVFREQ Governors
++#
++CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
++# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set
++# CONFIG_DEVFREQ_GOV_POWERSAVE is not set
++# CONFIG_DEVFREQ_GOV_USERSPACE is not set
++# CONFIG_DEVFREQ_GOV_PASSIVE is not set
++
++#
++# DEVFREQ Drivers
++#
++# CONFIG_PM_DEVFREQ_EVENT is not set
++# CONFIG_EXTCON is not set
++# CONFIG_MEMORY is not set
++# CONFIG_IIO is not set
++# CONFIG_NTB is not set
++# CONFIG_VME_BUS is not set
++# CONFIG_PWM is not set
++
++#
++# IRQ chip support
++#
++CONFIG_IRQCHIP=y
++CONFIG_ARM_GIC=y
++CONFIG_ARM_GIC_MAX_NR=1
++CONFIG_ARM_GIC_V2M=y
++CONFIG_ARM_GIC_V3=y
++CONFIG_ARM_GIC_V3_ITS=y
++CONFIG_ARM_GIC_V3_ITS_PCI=y
++CONFIG_HISILICON_IRQ_MBIGEN=y
++CONFIG_PARTITION_PERCPU=y
++# CONFIG_IPACK_BUS is not set
++CONFIG_RESET_CONTROLLER=y
++# CONFIG_RESET_TI_SYSCON is not set
++# CONFIG_FMC is not set
++
++#
++# PHY Subsystem
++#
++CONFIG_GENERIC_PHY=y
++# CONFIG_PHY_XGENE is not set
++# CONFIG_BCM_KONA_USB2_PHY is not set
++# CONFIG_PHY_PXA_28NM_HSIC is not set
++# CONFIG_PHY_PXA_28NM_USB2 is not set
++# CONFIG_PHY_MAPPHONE_MDM6600 is not set
++CONFIG_VENDOR_USB_PHY=y
++CONFIG_PHY_BSP_USB3=y
++CONFIG_BSP_USB_PHY=y
++CONFIG_USB_MODE_OPTION=y
++# CONFIG_USB_DRD0_IN_HOST is not set
++CONFIG_USB_DRD0_IN_DEVICE=y
++# CONFIG_POWERCAP is not set
++# CONFIG_MCB is not set
++# CONFIG_RAS is not set
++# CONFIG_LIBNVDIMM is not set
++# CONFIG_DAX is not set
++CONFIG_NVMEM=y
++
++#
++# HW tracing support
++#
++# CONFIG_STM is not set
++# CONFIG_INTEL_TH is not set
++# CONFIG_FPGA is not set
++# CONFIG_FSI is not set
++# CONFIG_TEE is not set
++CONFIG_PM_OPP=y
++# CONFIG_SIOX is not set
++# CONFIG_SLIMBUS is not set
++
++#
++# Vendor driver support
++#
++# CONFIG_CMA_MEM_SHARED is not set
++# CONFIG_CMA_ADVANCE_SHARE is not set
++CONFIG_VENDOR_NPU=y
++
++#
++# File systems
++#
++CONFIG_DCACHE_WORD_ACCESS=y
++CONFIG_FS_IOMAP=y
++# CONFIG_EXT2_FS is not set
++# CONFIG_EXT3_FS is not set
++CONFIG_EXT4_FS=y
++CONFIG_EXT4_USE_FOR_EXT2=y
++CONFIG_EXT4_FS_POSIX_ACL=y
++CONFIG_EXT4_FS_SECURITY=y
++# CONFIG_EXT4_ENCRYPTION is not set
++# CONFIG_EXT4_DEBUG is not set
++CONFIG_JBD2=y
++# CONFIG_JBD2_DEBUG is not set
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++CONFIG_XFS_FS=y
++CONFIG_XFS_QUOTA=y
++CONFIG_XFS_POSIX_ACL=y
++CONFIG_XFS_RT=y
++# CONFIG_XFS_ONLINE_SCRUB is not set
++# CONFIG_XFS_WARN is not set
++# CONFIG_XFS_DEBUG is not set
++# CONFIG_GFS2_FS is not set
++# CONFIG_OCFS2_FS is not set
++# CONFIG_BTRFS_FS is not set
++# CONFIG_NILFS2_FS is not set
++# CONFIG_F2FS_FS is not set
++# CONFIG_FS_DAX is not set
++CONFIG_FS_POSIX_ACL=y
++CONFIG_EXPORTFS=y
++# CONFIG_EXPORTFS_BLOCK_OPS is not set
++CONFIG_FILE_LOCKING=y
++CONFIG_MANDATORY_FILE_LOCKING=y
++# CONFIG_FS_ENCRYPTION is not set
++CONFIG_FSNOTIFY=y
++CONFIG_DNOTIFY=y
++CONFIG_INOTIFY_USER=y
++# CONFIG_FANOTIFY is not set
++CONFIG_QUOTA=y
++# CONFIG_QUOTA_NETLINK_INTERFACE is not set
++CONFIG_PRINT_QUOTA_WARNING=y
++# CONFIG_QUOTA_DEBUG is not set
++CONFIG_QUOTA_TREE=m
++CONFIG_QFMT_V1=m
++CONFIG_QFMT_V2=m
++CONFIG_QUOTACTL=y
++CONFIG_AUTOFS4_FS=m
++CONFIG_AUTOFS_FS=m
++CONFIG_FUSE_FS=y
++# CONFIG_CUSE is not set
++# CONFIG_OVERLAY_FS is not set
++
++#
++# Caches
++#
++# CONFIG_FSCACHE is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++CONFIG_ISO9660_FS=y
++# CONFIG_JOLIET is not set
++# CONFIG_ZISOFS is not set
++CONFIG_UDF_FS=y
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++CONFIG_VFAT_FS=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++# CONFIG_FAT_DEFAULT_UTF8 is not set
++# CONFIG_NTFS_FS is not set
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++# CONFIG_PROC_KCORE is not set
++CONFIG_PROC_SYSCTL=y
++CONFIG_PROC_PAGE_MONITOR=y
++# CONFIG_PROC_CHILDREN is not set
++CONFIG_KERNFS=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++CONFIG_TMPFS_POSIX_ACL=y
++CONFIG_TMPFS_XATTR=y
++# CONFIG_HUGETLBFS is not set
++CONFIG_MEMFD_CREATE=y
++CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
++CONFIG_CONFIGFS_FS=y
++CONFIG_MISC_FILESYSTEMS=y
++# CONFIG_ORANGEFS_FS is not set
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++CONFIG_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
++# CONFIG_JFFS2_SUMMARY is not set
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++CONFIG_JFFS2_RTIME=y
++CONFIG_UBIFS_FS=y
++# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
++CONFIG_UBIFS_FS_LZO=y
++CONFIG_UBIFS_FS_ZLIB=y
++# CONFIG_UBIFS_ATIME_SUPPORT is not set
++CONFIG_UBIFS_FS_XATTR=y
++# CONFIG_UBIFS_FS_ENCRYPTION is not set
++CONFIG_UBIFS_FS_SECURITY=y
++CONFIG_CRAMFS=y
++CONFIG_CRAMFS_BLOCKDEV=y
++# CONFIG_CRAMFS_MTD is not set
++CONFIG_SQUASHFS=y
++CONFIG_SQUASHFS_FILE_CACHE=y
++# CONFIG_SQUASHFS_FILE_DIRECT is not set
++CONFIG_SQUASHFS_DECOMP_SINGLE=y
++# CONFIG_SQUASHFS_DECOMP_MULTI is not set
++# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set
++# CONFIG_SQUASHFS_XATTR is not set
++CONFIG_SQUASHFS_ZLIB=y
++# CONFIG_SQUASHFS_LZ4 is not set
++CONFIG_SQUASHFS_LZO=y
++CONFIG_SQUASHFS_XZ=y
++# CONFIG_SQUASHFS_ZSTD is not set
++# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
++# CONFIG_SQUASHFS_EMBEDDED is not set
++CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
++# CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_OMFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_QNX6FS_FS is not set
++# CONFIG_ROMFS_FS is not set
++# CONFIG_PSTORE is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V2=y
++CONFIG_NFS_V3=y
++CONFIG_NFS_V3_ACL=y
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_SWAP is not set
++# CONFIG_NFSD is not set
++CONFIG_GRACE_PERIOD=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_ACL_SUPPORT=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_DEBUG is not set
++# CONFIG_CEPH_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=y
++CONFIG_NLS_CODEPAGE_737=m
++CONFIG_NLS_CODEPAGE_775=m
++CONFIG_NLS_CODEPAGE_850=m
++CONFIG_NLS_CODEPAGE_852=m
++CONFIG_NLS_CODEPAGE_855=m
++CONFIG_NLS_CODEPAGE_857=m
++CONFIG_NLS_CODEPAGE_860=m
++CONFIG_NLS_CODEPAGE_861=m
++CONFIG_NLS_CODEPAGE_862=m
++CONFIG_NLS_CODEPAGE_863=m
++CONFIG_NLS_CODEPAGE_864=m
++CONFIG_NLS_CODEPAGE_865=m
++CONFIG_NLS_CODEPAGE_866=m
++CONFIG_NLS_CODEPAGE_869=m
++CONFIG_NLS_CODEPAGE_936=y
++CONFIG_NLS_CODEPAGE_950=m
++CONFIG_NLS_CODEPAGE_932=m
++CONFIG_NLS_CODEPAGE_949=m
++CONFIG_NLS_CODEPAGE_874=m
++CONFIG_NLS_ISO8859_8=m
++CONFIG_NLS_CODEPAGE_1250=m
++CONFIG_NLS_CODEPAGE_1251=m
++CONFIG_NLS_ASCII=y
++CONFIG_NLS_ISO8859_1=y
++CONFIG_NLS_ISO8859_2=m
++CONFIG_NLS_ISO8859_3=m
++CONFIG_NLS_ISO8859_4=m
++CONFIG_NLS_ISO8859_5=m
++CONFIG_NLS_ISO8859_6=m
++CONFIG_NLS_ISO8859_7=m
++CONFIG_NLS_ISO8859_9=m
++CONFIG_NLS_ISO8859_13=m
++CONFIG_NLS_ISO8859_14=m
++CONFIG_NLS_ISO8859_15=m
++CONFIG_NLS_KOI8_R=m
++CONFIG_NLS_KOI8_U=m
++# CONFIG_NLS_MAC_ROMAN is not set
++# CONFIG_NLS_MAC_CELTIC is not set
++# CONFIG_NLS_MAC_CENTEURO is not set
++# CONFIG_NLS_MAC_CROATIAN is not set
++# CONFIG_NLS_MAC_CYRILLIC is not set
++# CONFIG_NLS_MAC_GAELIC is not set
++# CONFIG_NLS_MAC_GREEK is not set
++# CONFIG_NLS_MAC_ICELAND is not set
++# CONFIG_NLS_MAC_INUIT is not set
++# CONFIG_NLS_MAC_ROMANIAN is not set
++# CONFIG_NLS_MAC_TURKISH is not set
++CONFIG_NLS_UTF8=y
++# CONFIG_DLM is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY_DMESG_RESTRICT is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITYFS is not set
++CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
++# CONFIG_HARDENED_USERCOPY is not set
++# CONFIG_FORTIFY_SOURCE is not set
++# CONFIG_STATIC_USERMODEHELPER is not set
++CONFIG_DEFAULT_SECURITY_DAC=y
++CONFIG_DEFAULT_SECURITY=""
++CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_ALGAPI2=y
++CONFIG_CRYPTO_AEAD=m
++CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_BLKCIPHER2=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_HASH2=y
++CONFIG_CRYPTO_RNG=m
++CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_RNG_DEFAULT=m
++CONFIG_CRYPTO_AKCIPHER2=y
++CONFIG_CRYPTO_KPP2=y
++CONFIG_CRYPTO_ACOMP2=y
++# CONFIG_CRYPTO_RSA is not set
++# CONFIG_CRYPTO_DH is not set
++# CONFIG_CRYPTO_ECDH is not set
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_MANAGER2=y
++# CONFIG_CRYPTO_USER is not set
++CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_NULL=m
++CONFIG_CRYPTO_NULL2=y
++# CONFIG_CRYPTO_PCRYPT is not set
++CONFIG_CRYPTO_WORKQUEUE=y
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_MCRYPTD is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++CONFIG_CRYPTO_CCM=m
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_CHACHA20POLY1305 is not set
++# CONFIG_CRYPTO_AEGIS128 is not set
++# CONFIG_CRYPTO_AEGIS128L is not set
++# CONFIG_CRYPTO_AEGIS256 is not set
++# CONFIG_CRYPTO_MORUS640 is not set
++# CONFIG_CRYPTO_MORUS1280 is not set
++CONFIG_CRYPTO_SEQIV=m
++CONFIG_CRYPTO_ECHAINIV=m
++
++#
++# Block modes
++#
++# CONFIG_CRYPTO_CBC is not set
++# CONFIG_CRYPTO_CFB is not set
++CONFIG_CRYPTO_CTR=m
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=y
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_KEYWRAP is not set
++
++#
++# Hash modes
++#
++CONFIG_CRYPTO_CMAC=y
++CONFIG_CRYPTO_HMAC=m
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_VMAC is not set
++
++#
++# Digest
++#
++CONFIG_CRYPTO_CRC32C=y
++# CONFIG_CRYPTO_CRC32 is not set
++# CONFIG_CRYPTO_CRCT10DIF is not set
++# CONFIG_CRYPTO_GHASH is not set
++# CONFIG_CRYPTO_POLY1305 is not set
++# CONFIG_CRYPTO_MD4 is not set
++# CONFIG_CRYPTO_MD5 is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_RMD128 is not set
++# CONFIG_CRYPTO_RMD160 is not set
++# CONFIG_CRYPTO_RMD256 is not set
++# CONFIG_CRYPTO_RMD320 is not set
++# CONFIG_CRYPTO_SHA1 is not set
++CONFIG_CRYPTO_SHA256=y
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_SHA3 is not set
++# CONFIG_CRYPTO_SM3 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_WP512 is not set
++
++#
++# Ciphers
++#
++CONFIG_CRYPTO_AES=y
++# CONFIG_CRYPTO_AES_TI is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++CONFIG_CRYPTO_ARC4=y
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_DES is not set
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_CHACHA20 is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_SM4 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++
++#
++# Compression
++#
++CONFIG_CRYPTO_DEFLATE=y
++CONFIG_CRYPTO_LZO=y
++# CONFIG_CRYPTO_842 is not set
++# CONFIG_CRYPTO_LZ4 is not set
++# CONFIG_CRYPTO_LZ4HC is not set
++# CONFIG_CRYPTO_ZSTD is not set
++
++#
++# Random Number Generation
++#
++# CONFIG_CRYPTO_ANSI_CPRNG is not set
++CONFIG_CRYPTO_DRBG_MENU=m
++CONFIG_CRYPTO_DRBG_HMAC=y
++# CONFIG_CRYPTO_DRBG_HASH is not set
++# CONFIG_CRYPTO_DRBG_CTR is not set
++CONFIG_CRYPTO_DRBG=m
++CONFIG_CRYPTO_JITTERENTROPY=m
++# CONFIG_CRYPTO_USER_API_HASH is not set
++# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
++# CONFIG_CRYPTO_USER_API_RNG is not set
++# CONFIG_CRYPTO_USER_API_AEAD is not set
++CONFIG_CRYPTO_HW=y
++# CONFIG_CRYPTO_DEV_CCP is not set
++# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set
++# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set
++# CONFIG_CRYPTO_DEV_CCREE is not set
++# CONFIG_CRYPTO_DEV_HISI_SEC is not set
++
++#
++# Certificates for signature checking
++#
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_HAVE_ARCH_BITREVERSE=y
++CONFIG_RATIONAL=y
++CONFIG_GENERIC_STRNCPY_FROM_USER=y
++CONFIG_GENERIC_STRNLEN_USER=y
++CONFIG_GENERIC_NET_UTILS=y
++CONFIG_GENERIC_PCI_IOMAP=y
++CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
++CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
++# CONFIG_INDIRECT_PIO is not set
++CONFIG_CRC_CCITT=y
++CONFIG_CRC16=y
++# CONFIG_CRC_T10DIF is not set
++CONFIG_CRC_ITU_T=y
++CONFIG_CRC32=y
++# CONFIG_CRC32_SELFTEST is not set
++CONFIG_CRC32_SLICEBY8=y
++# CONFIG_CRC32_SLICEBY4 is not set
++# CONFIG_CRC32_SARWATE is not set
++# CONFIG_CRC32_BIT is not set
++# CONFIG_CRC64 is not set
++# CONFIG_CRC4 is not set
++# CONFIG_CRC7 is not set
++CONFIG_LIBCRC32C=y
++# CONFIG_CRC8 is not set
++CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
++# CONFIG_RANDOM32_SELFTEST is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_LZO_COMPRESS=y
++CONFIG_LZO_DECOMPRESS=y
++CONFIG_XZ_DEC=y
++CONFIG_XZ_DEC_X86=y
++CONFIG_XZ_DEC_POWERPC=y
++CONFIG_XZ_DEC_IA64=y
++CONFIG_XZ_DEC_ARM=y
++CONFIG_XZ_DEC_ARMTHUMB=y
++CONFIG_XZ_DEC_SPARC=y
++CONFIG_XZ_DEC_BCJ=y
++# CONFIG_XZ_DEC_TEST is not set
++CONFIG_GENERIC_ALLOCATOR=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT_MAP=y
++CONFIG_HAS_DMA=y
++CONFIG_NEED_SG_DMA_LENGTH=y
++CONFIG_NEED_DMA_MAP_STATE=y
++CONFIG_ARCH_DMA_ADDR_T_64BIT=y
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_DMA_DIRECT_OPS=y
++CONFIG_SWIOTLB=y
++CONFIG_SGL_ALLOC=y
++CONFIG_CPU_RMAP=y
++CONFIG_DQL=y
++CONFIG_NLATTR=y
++# CONFIG_CORDIC is not set
++# CONFIG_DDR is not set
++# CONFIG_IRQ_POLL is not set
++CONFIG_LIBFDT=y
++CONFIG_SG_POOL=y
++CONFIG_ARCH_HAS_SG_CHAIN=y
++CONFIG_SBITMAP=y
++# CONFIG_STRING_SELFTEST is not set
++
++#
++# Kernel hacking
++#
++
++#
++# printk and dmesg options
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
++CONFIG_CONSOLE_LOGLEVEL_QUIET=4
++CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
++# CONFIG_BOOT_PRINTK_DELAY is not set
++
++#
++# Compile-time checks and compiler options
++#
++# CONFIG_DEBUG_INFO is not set
++CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=2048
++# CONFIG_STRIP_ASM_SYMS is not set
++# CONFIG_READABLE_ASM is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_PAGE_OWNER is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++# CONFIG_DEBUG_SECTION_MISMATCH is not set
++CONFIG_SECTION_MISMATCH_WARN_ONLY=y
++CONFIG_ARCH_WANT_FRAME_POINTERS=y
++CONFIG_FRAME_POINTER=y
++# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
++CONFIG_MAGIC_SYSRQ=y
++CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
++CONFIG_MAGIC_SYSRQ_SERIAL=y
++CONFIG_DEBUG_KERNEL=y
++
++#
++# Memory Debugging
++#
++# CONFIG_PAGE_EXTENSION is not set
++# CONFIG_DEBUG_PAGEALLOC is not set
++# CONFIG_PAGE_POISONING is not set
++# CONFIG_DEBUG_RODATA_TEST is not set
++# CONFIG_DEBUG_OBJECTS is not set
++# CONFIG_SLUB_DEBUG_ON is not set
++# CONFIG_SLUB_STATS is not set
++CONFIG_HAVE_DEBUG_KMEMLEAK=y
++# CONFIG_DEBUG_KMEMLEAK is not set
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_VM is not set
++CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
++# CONFIG_DEBUG_VIRTUAL is not set
++# CONFIG_DEBUG_MEMORY_INIT is not set
++# CONFIG_DEBUG_PER_CPU_MAPS is not set
++CONFIG_HAVE_ARCH_KASAN=y
++# CONFIG_KASAN is not set
++CONFIG_ARCH_HAS_KCOV=y
++CONFIG_CC_HAS_SANCOV_TRACE_PC=y
++# CONFIG_KCOV is not set
++# CONFIG_DEBUG_SHIRQ is not set
++
++#
++# Debug Lockups and Hangs
++#
++# CONFIG_SOFTLOCKUP_DETECTOR is not set
++CONFIG_DETECT_HUNG_TASK=y
++CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
++# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
++# CONFIG_WQ_WATCHDOG is not set
++CONFIG_PANIC_ON_OOPS=y
++CONFIG_PANIC_ON_OOPS_VALUE=1
++CONFIG_PANIC_TIMEOUT=0
++CONFIG_SCHED_DEBUG=y
++CONFIG_SCHED_INFO=y
++CONFIG_SCHEDSTATS=y
++# CONFIG_SCHED_STACK_END_CHECK is not set
++# CONFIG_DEBUG_TIMEKEEPING is not set
++
++#
++# Lock Debugging (spinlocks, mutexes, etc...)
++#
++CONFIG_LOCK_DEBUGGING_SUPPORT=y
++# CONFIG_PROVE_LOCKING is not set
++# CONFIG_LOCK_STAT is not set
++# CONFIG_DEBUG_RT_MUTEXES is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++# CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
++# CONFIG_DEBUG_RWSEMS is not set
++# CONFIG_DEBUG_LOCK_ALLOC is not set
++# CONFIG_DEBUG_ATOMIC_SLEEP is not set
++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++# CONFIG_LOCK_TORTURE_TEST is not set
++# CONFIG_WW_MUTEX_SELFTEST is not set
++CONFIG_STACKTRACE=y
++# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set
++# CONFIG_DEBUG_KOBJECT is not set
++CONFIG_HAVE_DEBUG_BUGVERBOSE=y
++CONFIG_DEBUG_BUGVERBOSE=y
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_PI_LIST is not set
++# CONFIG_DEBUG_SG is not set
++# CONFIG_DEBUG_NOTIFIERS is not set
++# CONFIG_DEBUG_CREDENTIALS is not set
++
++#
++# RCU Debugging
++#
++# CONFIG_RCU_PERF_TEST is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++CONFIG_RCU_CPU_STALL_TIMEOUT=60
++CONFIG_RCU_TRACE=y
++# CONFIG_RCU_EQS_DEBUG is not set
++# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
++# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
++# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
++# CONFIG_NOTIFIER_ERROR_INJECTION is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_LATENCYTOP is not set
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
++CONFIG_HAVE_C_RECORDMCOUNT=y
++CONFIG_TRACE_CLOCK=y
++CONFIG_TRACING_SUPPORT=y
++# CONFIG_FTRACE is not set
++# CONFIG_DMA_API_DEBUG is not set
++CONFIG_RUNTIME_TESTING_MENU=y
++# CONFIG_TEST_LIST_SORT is not set
++# CONFIG_TEST_SORT is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
++# CONFIG_RBTREE_TEST is not set
++# CONFIG_INTERVAL_TREE_TEST is not set
++# CONFIG_PERCPU_TEST is not set
++# CONFIG_ATOMIC64_SELFTEST is not set
++# CONFIG_TEST_HEXDUMP is not set
++# CONFIG_TEST_STRING_HELPERS is not set
++# CONFIG_TEST_KSTRTOX is not set
++# CONFIG_TEST_PRINTF is not set
++# CONFIG_TEST_BITMAP is not set
++# CONFIG_TEST_BITFIELD is not set
++# CONFIG_TEST_UUID is not set
++# CONFIG_TEST_OVERFLOW is not set
++# CONFIG_TEST_RHASHTABLE is not set
++# CONFIG_TEST_HASH is not set
++# CONFIG_TEST_IDA is not set
++# CONFIG_TEST_LKM is not set
++# CONFIG_TEST_USER_COPY is not set
++# CONFIG_TEST_BPF is not set
++# CONFIG_FIND_BIT_BENCHMARK is not set
++# CONFIG_TEST_FIRMWARE is not set
++# CONFIG_TEST_SYSCTL is not set
++# CONFIG_TEST_UDELAY is not set
++# CONFIG_TEST_STATIC_KEYS is not set
++# CONFIG_TEST_KMOD is not set
++# CONFIG_MEMTEST is not set
++# CONFIG_BUG_ON_DATA_CORRUPTION is not set
++# CONFIG_SAMPLES is not set
++CONFIG_HAVE_ARCH_KGDB=y
++# CONFIG_KGDB is not set
++CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
++# CONFIG_UBSAN is not set
++CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
++# CONFIG_STRICT_DEVMEM is not set
++# CONFIG_ARM64_PTDUMP_DEBUGFS is not set
++# CONFIG_PID_IN_CONTEXTIDR is not set
++# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
++# CONFIG_DEBUG_WX is not set
++# CONFIG_DEBUG_ALIGN_RODATA is not set
++# CONFIG_ARM64_RELOC_TEST is not set
++# CONFIG_CORESIGHT is not set
+diff --git a/arch/arm64/kernel/pci.c b/arch/arm64/kernel/pci.c
+index 1006ed2d7c60..cdbd2606e4b8 100644
+--- a/arch/arm64/kernel/pci.c
++++ b/arch/arm64/kernel/pci.c
+@@ -29,6 +29,18 @@ int pcibios_alloc_irq(struct pci_dev *dev)
+
+ return 0;
+ }
++#else
++#ifdef CONFIG_ARCH_BSP
++/*
++ * Try to assign the IRQ number when probing a new device
++ */
++int pcibios_alloc_irq(struct pci_dev *dev)
++{
++ dev->irq = of_irq_parse_and_map_pci(dev, 0, 0);
++
++ return 0;
++}
++#endif
+ #endif
+
+ /*
+diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
+index be67a9c42628..ab6cdc8a503c 100644
+--- a/arch/arm64/mm/init.c
++++ b/arch/arm64/mm/init.c
+@@ -188,6 +188,10 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max)
+ unsigned int __maybe_unused acpi_zone_dma_bits;
+ unsigned int __maybe_unused dt_zone_dma_bits;
+ phys_addr_t __maybe_unused dma32_phys_limit = max_zone_phys(32);
++//#ifdef CONFIG_ARCH_BSP
++// extern phys_addr_t get_zones_start(void);
++// dma32_phys_limit = min(dma32_phys_limit, get_zones_start());
++//#endif
+
+ #ifdef CONFIG_ZONE_DMA
+ acpi_zone_dma_bits = fls64(acpi_iort_dma_get_max_cpu_address());
+diff --git a/drivers/Kconfig b/drivers/Kconfig
+index b1b3d958f065..0f5c83ae9bd8 100644
+--- a/drivers/Kconfig
++++ b/drivers/Kconfig
+@@ -240,4 +240,6 @@ source "drivers/most/Kconfig"
+
+ source "drivers/roh/Kconfig"
+
++source "drivers/vendor/Kconfig"
++
+ endmenu
+diff --git a/drivers/Makefile b/drivers/Makefile
+index bfbf65533169..10342bad3b90 100644
+--- a/drivers/Makefile
++++ b/drivers/Makefile
+@@ -192,3 +192,4 @@ obj-$(CONFIG_INTERCONNECT) += interconnect/
+ obj-$(CONFIG_COUNTER) += counter/
+ obj-$(CONFIG_MOST) += most/
+ obj-$(CONFIG_ROH) += roh/
++obj-$(CONFIG_ARCH_BSP) += vendor/
+diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
+index c715d4681a0b..39c659f7a68d 100644
+--- a/drivers/clk/Kconfig
++++ b/drivers/clk/Kconfig
+@@ -384,5 +384,6 @@ source "drivers/clk/ti/Kconfig"
+ source "drivers/clk/uniphier/Kconfig"
+ source "drivers/clk/x86/Kconfig"
+ source "drivers/clk/zynqmp/Kconfig"
++source "drivers/clk/vendor/Kconfig"
+
+ endif
+diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
+index da8fcf147eb1..833b7600d36f 100644
+--- a/drivers/clk/Makefile
++++ b/drivers/clk/Makefile
+@@ -124,3 +124,4 @@ endif
+ obj-$(CONFIG_ARCH_ZX) += zte/
+ obj-$(CONFIG_ARCH_ZYNQ) += zynq/
+ obj-$(CONFIG_COMMON_CLK_ZYNQMP) += zynqmp/
++obj-$(CONFIG_ARCH_BSP) += vendor/
+diff --git a/drivers/clk/vendor/Kconfig b/drivers/clk/vendor/Kconfig
+new file mode 100644
+index 000000000000..4f446ec69e8e
+--- /dev/null
++++ b/drivers/clk/vendor/Kconfig
+@@ -0,0 +1,12 @@
++
++
++config RESET_BSP
++ bool "Vendor Reset Controller Driver"
++ default y
++ help
++ Build reset controller driver for Vendor device chipsets.
++config COMMON_CLK_SS928V100
++ tristate "SS928V100 Clock Driver"
++ default y
++ help
++ build the clock driver for SS928V100
+diff --git a/drivers/clk/vendor/Makefile b/drivers/clk/vendor/Makefile
+new file mode 100644
+index 000000000000..a2a3626a9954
+--- /dev/null
++++ b/drivers/clk/vendor/Makefile
+@@ -0,0 +1,8 @@
++# SPDX-License-Identifier: GPL-2.0
++#
++
++obj-y += clk.o clkgate_separated.o
++
++obj-$(CONFIG_ARCH_HI3519DV500_FAMILY) += clk_hi3519dv500.o
++obj-$(CONFIG_RESET_BSP) += reset.o
++obj-$(CONFIG_COMMON_CLK_SS928V100) += clk_ss928v100.o
+diff --git a/drivers/clk/vendor/clk.c b/drivers/clk/vendor/clk.c
+new file mode 100644
+index 000000000000..ceef293f073f
+--- /dev/null
++++ b/drivers/clk/vendor/clk.c
+@@ -0,0 +1,288 @@
++/*
++ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2020-2023. All rights reserved.
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++#include "clk.h"
++
++static DEFINE_SPINLOCK(bsp_clk_lock);
++
++struct bsp_clock_data *bsp_clk_alloc(struct platform_device *pdev,
++ int nr_clks)
++{
++ struct bsp_clock_data *clk_data;
++ struct resource *res;
++ struct clk **clk_table;
++
++ clk_data = devm_kmalloc(&pdev->dev, sizeof(*clk_data), GFP_KERNEL);
++ if (!clk_data)
++ return NULL;
++
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (!res)
++ return NULL;
++ clk_data->base = devm_ioremap(&pdev->dev,
++ res->start, resource_size(res));
++ if (!clk_data->base)
++ return NULL;
++
++ clk_table = devm_kmalloc_array(&pdev->dev, nr_clks,
++ sizeof(*clk_table),
++ GFP_KERNEL);
++ if (!clk_table)
++ return NULL;
++
++ clk_data->clk_data.clks = clk_table;
++ clk_data->clk_data.clk_num = nr_clks;
++
++ return clk_data;
++}
++EXPORT_SYMBOL_GPL(bsp_clk_alloc);
++
++struct bsp_clock_data *bsp_clk_init(struct device_node *np,
++ int nr_clks)
++{
++ struct bsp_clock_data *clk_data;
++ struct clk **clk_table;
++ void __iomem *base;
++
++ base = of_iomap(np, 0);
++ if (!base) {
++ pr_err("%s: failed to map clock registers\n", __func__);
++ goto err;
++ }
++
++ clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL);
++ if (!clk_data)
++ goto err;
++
++ clk_data->base = base;
++ clk_table = kcalloc(nr_clks, sizeof(*clk_table), GFP_KERNEL);
++ if (!clk_table)
++ goto err_data;
++
++ clk_data->clk_data.clks = clk_table;
++ clk_data->clk_data.clk_num = nr_clks;
++ of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data->clk_data);
++ return clk_data;
++err_data:
++ if (base) {
++ iounmap(base);
++ base = NULL;
++ }
++ kfree(clk_data);
++err:
++ return NULL;
++}
++EXPORT_SYMBOL_GPL(bsp_clk_init);
++
++int bsp_clk_register_fixed_rate(const struct bsp_fixed_rate_clock *clks,
++ int nums, struct bsp_clock_data *data)
++{
++ struct clk *clk;
++ int i;
++
++ for (i = 0; i < nums; i++) {
++ clk = clk_register_fixed_rate(NULL, clks[i].name,
++ clks[i].parent_name,
++ clks[i].flags,
++ clks[i].fixed_rate);
++ if (IS_ERR(clk)) {
++ pr_err("%s: failed to register clock %s\n",
++ __func__, clks[i].name);
++ goto err;
++ }
++ data->clk_data.clks[clks[i].id] = clk;
++ }
++
++ return 0;
++
++err:
++ while (i--)
++ clk_unregister_fixed_rate(data->clk_data.clks[clks[i].id]);
++
++ return PTR_ERR(clk);
++}
++EXPORT_SYMBOL_GPL(bsp_clk_register_fixed_rate);
++
++int bsp_clk_register_fixed_factor(const struct bsp_fixed_factor_clock *clks,
++ int nums,
++ struct bsp_clock_data *data)
++{
++ struct clk *clk;
++ int i;
++
++ for (i = 0; i < nums; i++) {
++ clk = clk_register_fixed_factor(NULL, clks[i].name,
++ clks[i].parent_name,
++ clks[i].flags, clks[i].mult,
++ clks[i].div);
++ if (IS_ERR(clk)) {
++ pr_err("%s: failed to register clock %s\n",
++ __func__, clks[i].name);
++ goto err;
++ }
++ data->clk_data.clks[clks[i].id] = clk;
++ }
++
++ return 0;
++
++err:
++ while (i--)
++ clk_unregister_fixed_factor(data->clk_data.clks[clks[i].id]);
++
++ return PTR_ERR(clk);
++}
++EXPORT_SYMBOL_GPL(bsp_clk_register_fixed_factor);
++
++int bsp_clk_register_mux(const struct bsp_mux_clock *clks,
++ int nums, struct bsp_clock_data *data)
++{
++ struct clk *clk;
++ void __iomem *base = data->base;
++ int i;
++
++ for (i = 0; i < nums; i++) {
++ u32 mask = BIT(clks[i].width) - 1;
++
++ clk = clk_register_mux_table(NULL, clks[i].name,
++ clks[i].parent_names,
++ clks[i].num_parents, clks[i].flags,
++ base + clks[i].offset, clks[i].shift,
++ mask, clks[i].mux_flags,
++ clks[i].table, &bsp_clk_lock);
++ if (IS_ERR(clk)) {
++ pr_err("%s: failed to register clock %s\n",
++ __func__, clks[i].name);
++ goto err;
++ }
++
++ if (clks[i].alias)
++ clk_register_clkdev(clk, clks[i].alias, NULL);
++
++ data->clk_data.clks[clks[i].id] = clk;
++ }
++
++ return 0;
++
++err:
++ while (i--)
++ clk_unregister_mux(data->clk_data.clks[clks[i].id]);
++
++ return PTR_ERR(clk);
++}
++EXPORT_SYMBOL_GPL(bsp_clk_register_mux);
++
++int bsp_clk_register_divider(const struct bsp_divider_clock *clks,
++ int nums, struct bsp_clock_data *data)
++{
++ struct clk *clk;
++ void __iomem *base = data->base;
++ int i;
++
++ for (i = 0; i < nums; i++) {
++ clk = clk_register_divider_table(NULL, clks[i].name,
++ clks[i].parent_name,
++ clks[i].flags,
++ base + clks[i].offset,
++ clks[i].shift, clks[i].width,
++ clks[i].div_flags,
++ clks[i].table,
++ &bsp_clk_lock);
++ if (IS_ERR(clk)) {
++ pr_err("%s: failed to register clock %s\n",
++ __func__, clks[i].name);
++ goto err;
++ }
++
++ if (clks[i].alias)
++ clk_register_clkdev(clk, clks[i].alias, NULL);
++
++ data->clk_data.clks[clks[i].id] = clk;
++ }
++
++ return 0;
++
++err:
++ while (i--)
++ clk_unregister_divider(data->clk_data.clks[clks[i].id]);
++
++ return PTR_ERR(clk);
++}
++EXPORT_SYMBOL_GPL(bsp_clk_register_divider);
++
++int bsp_clk_register_gate(const struct bsp_gate_clock *clks,
++ int nums, struct bsp_clock_data *data)
++{
++ struct clk *clk;
++ void __iomem *base = data->base;
++ int i;
++
++ for (i = 0; i < nums; i++) {
++ clk = clk_register_gate(NULL, clks[i].name,
++ clks[i].parent_name,
++ clks[i].flags,
++ base + clks[i].offset,
++ clks[i].bit_idx,
++ clks[i].gate_flags,
++ &bsp_clk_lock);
++ if (IS_ERR(clk)) {
++ pr_err("%s: failed to register clock %s\n",
++ __func__, clks[i].name);
++ goto err;
++ }
++
++ if (clks[i].alias)
++ clk_register_clkdev(clk, clks[i].alias, NULL);
++
++ data->clk_data.clks[clks[i].id] = clk;
++ }
++
++ return 0;
++
++err:
++ while (i--)
++ clk_unregister_gate(data->clk_data.clks[clks[i].id]);
++
++ return PTR_ERR(clk);
++}
++EXPORT_SYMBOL_GPL(bsp_clk_register_gate);
++
++void bsp_clk_register_gate_sep(const struct bsp_gate_clock *clks,
++ int nums, struct bsp_clock_data *data)
++{
++ struct clk *clk;
++ void __iomem *base = data->base;
++ int i;
++
++ for (i = 0; i < nums; i++) {
++ clk = bsp_register_clkgate_sep(NULL, clks[i].name,
++ clks[i].parent_name,
++ clks[i].flags,
++ base + clks[i].offset,
++ clks[i].bit_idx,
++ clks[i].gate_flags,
++ &bsp_clk_lock);
++ if (IS_ERR(clk)) {
++ pr_err("%s: failed to register clock %s\n",
++ __func__, clks[i].name);
++ continue;
++ }
++
++ if (clks[i].alias)
++ clk_register_clkdev(clk, clks[i].alias, NULL);
++
++ data->clk_data.clks[clks[i].id] = clk;
++ }
++}
++EXPORT_SYMBOL_GPL(bsp_clk_register_gate_sep);
++
+diff --git a/drivers/clk/vendor/clk.h b/drivers/clk/vendor/clk.h
+new file mode 100644
+index 000000000000..f197a9bc06fd
+--- /dev/null
++++ b/drivers/clk/vendor/clk.h
+@@ -0,0 +1,127 @@
++/*
++ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2020-2023. All rights reserved.
++ */
++
++#ifndef __BSP_CLK_H
++#define __BSP_CLK_H
++
++#include
++#include
++#include
++
++struct platform_device;
++
++struct bsp_clock_data {
++ struct clk_onecell_data clk_data;
++ void __iomem *base;
++};
++
++struct bsp_fixed_rate_clock {
++ unsigned int id;
++ char *name;
++ const char *parent_name;
++ unsigned long flags;
++ unsigned long fixed_rate;
++};
++
++struct bsp_fixed_factor_clock {
++ unsigned int id;
++ char *name;
++ const char *parent_name;
++ unsigned long mult;
++ unsigned long div;
++ unsigned long flags;
++};
++
++struct bsp_mux_clock {
++ unsigned int id;
++ const char *name;
++ const char *const *parent_names;
++ u8 num_parents;
++ unsigned long flags;
++ unsigned long offset;
++ u8 shift;
++ u8 width;
++ u8 mux_flags;
++ u32 *table;
++ const char *alias;
++};
++
++struct bsp_phase_clock {
++ unsigned int id;
++ const char *name;
++ const char *parent_names;
++ unsigned long flags;
++ unsigned long offset;
++ u8 shift;
++ u8 width;
++ u32 *phase_degrees;
++ u32 *phase_regvals;
++ u8 phase_num;
++};
++
++struct bsp_divider_clock {
++ unsigned int id;
++ const char *name;
++ const char *parent_name;
++ unsigned long flags;
++ unsigned long offset;
++ u8 shift;
++ u8 width;
++ u8 div_flags;
++ struct clk_div_table *table;
++ const char *alias;
++};
++
++struct bsp_gate_clock {
++ unsigned int id;
++ const char *name;
++ const char *parent_name;
++ unsigned long flags;
++ unsigned long offset;
++ u8 bit_idx;
++ u8 gate_flags;
++ const char *alias;
++};
++
++struct clk *bsp_register_clkgate_sep(struct device *, const char *,
++ const char *, unsigned long,
++ void __iomem *, u8,
++ u8, spinlock_t *);
++
++struct bsp_clock_data *bsp_clk_alloc(struct platform_device *, int);
++struct bsp_clock_data *bsp_clk_init(struct device_node *, int);
++int bsp_clk_register_fixed_rate(const struct bsp_fixed_rate_clock *,
++ int, struct bsp_clock_data *);
++int bsp_clk_register_fixed_factor(const struct bsp_fixed_factor_clock *,
++ int, struct bsp_clock_data *);
++int bsp_clk_register_mux(const struct bsp_mux_clock *, int,
++ struct bsp_clock_data *);
++int bsp_clk_register_divider(const struct bsp_divider_clock *,
++ int, struct bsp_clock_data *);
++int bsp_clk_register_gate(const struct bsp_gate_clock *,
++ int, struct bsp_clock_data *);
++void bsp_clk_register_gate_sep(const struct bsp_gate_clock *,
++ int, struct bsp_clock_data *);
++
++#define bsp_clk_unregister(type) \
++static inline \
++void bsp_clk_unregister_##type(const struct bsp_##type##_clock *clks, \
++ int nums, struct bsp_clock_data *data) \
++{ \
++ struct clk **clocks = data->clk_data.clks; \
++ int i; \
++ for (i = 0; i < nums; i++) { \
++ int id = clks[i].id; \
++ if (clocks[id]) \
++ clk_unregister_##type(clocks[id]); \
++ } \
++}
++
++bsp_clk_unregister(fixed_rate)
++bsp_clk_unregister(fixed_factor)
++bsp_clk_unregister(mux)
++bsp_clk_unregister(divider)
++bsp_clk_unregister(gate)
++
++#endif /* __BSP_CLK_H */
+diff --git a/drivers/clk/vendor/clk_hi3519dv500.c b/drivers/clk/vendor/clk_hi3519dv500.c
+new file mode 100644
+index 000000000000..e2c106fa3249
+--- /dev/null
++++ b/drivers/clk/vendor/clk_hi3519dv500.c
+@@ -0,0 +1,507 @@
++/*
++ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2020-2023. All rights reserved.
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++
++#include "clk.h"
++#include "crg.h"
++#include "reset.h"
++
++/* soc clk config */
++static const struct bsp_fixed_rate_clock hi3519dv500_fixed_rate_clks_crg[] = {
++ { HI3519DV500_FIXED_2400M, "2400m", NULL, 0, 2400000000, },
++ { HI3519DV500_FIXED_1200M, "1200m", NULL, 0, 1200000000, },
++ { HI3519DV500_FIXED_1188M, "1188m", NULL, 0, 1188000000, },
++ { HI3519DV500_FIXED_896M, "896m", NULL, 0, 896000000, },
++ { HI3519DV500_FIXED_800M, "800m", NULL, 0, 800000000, },
++ { HI3519DV500_FIXED_792M, "792m", NULL, 0, 792000000, },
++ { HI3519DV500_FIXED_786M, "786m", NULL, 0, 786000000, },
++ { HI3519DV500_FIXED_750M, "750m", NULL, 0, 750000000, },
++ { HI3519DV500_FIXED_700M, "700m", NULL, 0, 700000000, },
++ { HI3519DV500_FIXED_672M, "672m", NULL, 0, 672000000, },
++ { HI3519DV500_FIXED_600M, "600m", NULL, 0, 600000000, },
++ { HI3519DV500_FIXED_594M, "594m", NULL, 0, 594000000, },
++ { HI3519DV500_FIXED_560M, "560m", NULL, 0, 560000000, },
++ { HI3519DV500_FIXED_500M, "500m", NULL, 0, 500000000, },
++ { HI3519DV500_FIXED_475M, "475m", NULL, 0, 475000000, },
++ { HI3519DV500_FIXED_396M, "396m", NULL, 0, 396000000, },
++ { HI3519DV500_FIXED_300M, "300m", NULL, 0, 300000000, },
++ { HI3519DV500_FIXED_297M, "297m", NULL, 0, 297000000, },
++ { HI3519DV500_FIXED_257M, "257m", NULL, 0, 257000000, },
++ { HI3519DV500_FIXED_250M, "250m", NULL, 0, 250000000, },
++ { HI3519DV500_FIXED_200M, "200m", NULL, 0, 200000000, },
++ { HI3519DV500_FIXED_198M, "198m", NULL, 0, 198000000, },
++ { HI3519DV500_FIXED_187P_5M, "187p5m", NULL, 0, 187500000, },
++ { HI3519DV500_FIXED_150M, "150m", NULL, 0, 150000000, },
++ { HI3519DV500_FIXED_148P_5M, "148p5m", NULL, 0, 148500000, },
++ { HI3519DV500_FIXED_134M, "134m", NULL, 0, 134000000, },
++ { HI3519DV500_FIXED_108M, "108m", NULL, 0, 108000000, },
++ { HI3519DV500_FIXED_100M, "100m", NULL, 0, 100000000, },
++ { HI3519DV500_FIXED_99M, "99m", NULL, 0, 99000000, },
++ { HI3519DV500_FIXED_74P_25M, "74p25m", NULL, 0, 74250000, },
++ { HI3519DV500_FIXED_72M, "72m", NULL, 0, 72000000, },
++ { HI3519DV500_FIXED_64M, "64m", NULL, 0, 64000000, },
++ { HI3519DV500_FIXED_60M, "60m", NULL, 0, 60000000, },
++ { HI3519DV500_FIXED_54M, "54m", NULL, 0, 54000000, },
++ { HI3519DV500_FIXED_50M, "50m", NULL, 0, 50000000, },
++ { HI3519DV500_FIXED_49P_5M, "49p5m", NULL, 0, 49500000, },
++ { HI3519DV500_FIXED_37P_125M, "37p125m", NULL, 0, 37125000, },
++ { HI3519DV500_FIXED_36M, "36m", NULL, 0, 36000000, },
++ { HI3519DV500_FIXED_27M, "27m", NULL, 0, 27000000, },
++ { HI3519DV500_FIXED_25M, "25m", NULL, 0, 25000000, },
++ { HI3519DV500_FIXED_24M, "24m", NULL, 0, 24000000, },
++ { HI3519DV500_FIXED_12M, "12m", NULL, 0, 12000000, },
++ { HI3519DV500_FIXED_12P_288M, "12p288m", NULL, 0, 12288000, },
++ { HI3519DV500_FIXED_6M, "6m", NULL, 0, 6000000, },
++ { HI3519DV500_FIXED_3M, "3m", NULL, 0, 3000000, },
++ { HI3519DV500_FIXED_1P_6M, "1p6m", NULL, 0, 1600000, },
++ { HI3519DV500_FIXED_400K, "400k", NULL, 0, 400000, },
++ { HI3519DV500_FIXED_100K, "100k", NULL, 0, 100000, },
++};
++
++
++static const char *fmc_mux_p[] __initdata = {
++ "24m", "100m", "150m", "198m", "237m", "300m", "396m"
++};
++static u32 fmc_mux_table[] = {0, 1, 2, 3, 4, 5, 6};
++
++static const char *mmc_mux_p[] __initdata = {
++ "400k", "25m", "50m", "100m", "150m", "187p5m", "200m"
++};
++static u32 mmc_mux_table[] = {0, 1, 2, 3, 4, 5, 6, 7};
++
++static const char *sdio0_mux_p[] __initdata = {
++ "400k", "25m", "50m", "100m", "150m", "187p5m", "200m"
++};
++static u32 sdio0_mux_table[] = {0, 1, 2, 3, 4, 5, 6, 7};
++
++static const char *sdio1_mux_p[] __initdata = {
++ "400k", "25m", "50m", "100m", "150m", "187p5m", "200m"
++};
++static u32 sdio1_mux_table[] = {0, 1, 2, 3, 4, 5, 6, 7};
++
++static const char *uart_mux_p[] __initdata = {"100m", "50m", "24m", "3m"};
++static u32 uart_mux_table[] = {0, 1, 2, 3};
++
++static const char *i2c_mux_p[] __initdata = {
++ "50m", "100m"
++};
++static u32 i2c_mux_table[] = {0, 1};
++
++static const char * pwm0_mux_p[] __initdata = {"198m"};
++static u32 pwm0_mux_table[] = {0};
++
++static const char * pwm1_mux_p[] __initdata = {"198m"};
++static u32 pwm1_mux_table[] = {0};
++
++static const char * pwm2_mux_p[] __initdata = {"198m"};
++static u32 pwm2_mux_table[] = {0};
++
++static struct bsp_mux_clock hi3519dv500_mux_clks_crg[] __initdata = {
++ {
++ HI3519DV500_FMC_MUX, "fmc_mux",
++ fmc_mux_p, ARRAY_SIZE(fmc_mux_p),
++ CLK_SET_RATE_PARENT, 0x3f40, 12, 3, 0, fmc_mux_table,
++ },
++ {
++ HI3519DV500_MMC0_MUX, "mmc0_mux",
++ mmc_mux_p, ARRAY_SIZE(mmc_mux_p),
++ CLK_SET_RATE_PARENT, 0x34c0, 24, 3, 0, mmc_mux_table,
++ },
++ {
++ HI3519DV500_MMC1_MUX, "mmc1_mux",
++ sdio0_mux_p, ARRAY_SIZE(sdio0_mux_p),
++ CLK_SET_RATE_PARENT, 0x35c0, 24, 3, 0, sdio0_mux_table,
++ },
++ {
++ HI3519DV500_MMC2_MUX, "mmc2_mux",
++ sdio1_mux_p, ARRAY_SIZE(sdio1_mux_p),
++ CLK_SET_RATE_PARENT, 0x36c0, 24, 3, 0, sdio1_mux_table,
++ },
++ {
++ HI3519DV500_UART0_MUX, "uart0_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x4180, 12, 2, 0, uart_mux_table
++ },
++ {
++ HI3519DV500_UART1_MUX, "uart1_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x4188, 12, 2, 0, uart_mux_table
++ },
++ {
++ HI3519DV500_UART2_MUX, "uart2_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x4190, 12, 2, 0, uart_mux_table
++ },
++ {
++ HI3519DV500_UART3_MUX, "uart3_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x4198, 12, 2, 0, uart_mux_table
++ },
++ {
++ HI3519DV500_UART4_MUX, "uart4_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x41a0, 12, 2, 0, uart_mux_table
++ },
++ {
++ HI3519DV500_UART5_MUX, "uart5_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x41a8, 12, 2, 0, uart_mux_table
++ },
++ {
++ HI3519DV500_I2C0_MUX, "i2c0_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x4280, 12, 1, 0, i2c_mux_table
++ },
++ {
++ HI3519DV500_I2C1_MUX, "i2c1_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x4288, 12, 1, 0, i2c_mux_table
++ },
++ {
++ HI3519DV500_I2C2_MUX, "i2c2_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x4290, 12, 1, 0, i2c_mux_table
++ },
++ {
++ HI3519DV500_I2C3_MUX, "i2c3_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x4298, 12, 1, 0, i2c_mux_table
++ },
++ {
++ HI3519DV500_I2C4_MUX, "i2c4_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x42a0, 12, 1, 0, i2c_mux_table
++ },
++ {
++ HI3519DV500_I2C5_MUX, "i2c5_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x42a8, 12, 1, 0, i2c_mux_table
++ },
++ {
++ HI3519DV500_I2C6_MUX, "i2c6_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x42b0, 12, 1, 0, i2c_mux_table
++ },
++ {
++ HI3519DV500_I2C7_MUX, "i2c7_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x42b8, 12, 1, 0, i2c_mux_table
++ },
++ {
++ HI3519DV500_PWM0_MUX, "pwm0_mux",
++ pwm0_mux_p, ARRAY_SIZE(pwm0_mux_p),
++ CLK_SET_RATE_PARENT, 0x4588, 12, 2, 0, pwm0_mux_table
++ },
++ {
++ HI3519DV500_PWM1_MUX, "pwm1_mux",
++ pwm1_mux_p, ARRAY_SIZE(pwm1_mux_p),
++ CLK_SET_RATE_PARENT, 0x4590, 12, 2, 0, pwm1_mux_table
++ },
++ {
++ HI3519DV500_PWM2_MUX, "pwm2_mux",
++ pwm2_mux_p, ARRAY_SIZE(pwm2_mux_p),
++ CLK_SET_RATE_PARENT, 0x4598, 12, 2, 0, pwm2_mux_table
++ },
++};
++
++static struct bsp_fixed_factor_clock
++ hi3519dv500_fixed_factor_clks[] __initdata = {
++};
++
++static struct bsp_gate_clock hi3519dv500_gate_clks[] __initdata = {
++ {
++ HI3519DV500_FMC_CLK, "clk_fmc", "fmc_mux",
++ CLK_SET_RATE_PARENT, 0x3f40, 4, 0,
++ },
++ {
++ HI3519DV500_MMC0_CLK, "clk_mmc0", "mmc0_mux",
++ CLK_SET_RATE_PARENT, 0x34c0, 0, 0,
++ },
++ {
++ HI3519DV500_MMC0_HCLK, "hclk_mmc0", NULL,
++ CLK_SET_RATE_PARENT, 0x34c0, 1, 0,
++ },
++ {
++ HI3519DV500_MMC1_CLK, "clk_mmc1", "mmc1_mux",
++ CLK_SET_RATE_PARENT, 0x35c0, 0, 0,
++ },
++ {
++ HI3519DV500_MMC1_HCLK, "hclk_mmc1", NULL,
++ CLK_SET_RATE_PARENT, 0x35c0, 1, 0,
++ },
++ {
++ HI3519DV500_MMC2_CLK, "clk_mmc2", "mmc2_mux",
++ CLK_SET_RATE_PARENT, 0x36c0, 0, 0,
++ },
++ {
++ HI3519DV500_MMC2_HCLK, "hclk_mmc2", NULL,
++ CLK_SET_RATE_PARENT, 0x36c0, 1, 0,
++ },
++ {
++ HI3519DV500_UART0_CLK, "clk_uart0", "uart0_mux",
++ CLK_SET_RATE_PARENT, 0x4180, 4, 0,
++ },
++ {
++ HI3519DV500_UART1_CLK, "clk_uart1", "uart1_mux",
++ CLK_SET_RATE_PARENT, 0x4188, 4, 0,
++ },
++ {
++ HI3519DV500_UART2_CLK, "clk_uart2", "uart2_mux",
++ CLK_SET_RATE_PARENT, 0x4190, 4, 0,
++ },
++ {
++ HI3519DV500_UART3_CLK, "clk_uart3", "uart3_mux",
++ CLK_SET_RATE_PARENT, 0x4198, 4, 0,
++ },
++ {
++ HI3519DV500_UART4_CLK, "clk_uart4", "uart4_mux",
++ CLK_SET_RATE_PARENT, 0x41A0, 4, 0,
++ },
++ {
++ HI3519DV500_UART5_CLK, "clk_uart5", "uart5_mux",
++ CLK_SET_RATE_PARENT, 0x41a8, 4, 0,
++ },
++ /* ethernet mac */
++ {
++ HI3519DV500_ETH_CLK, "clk_eth", NULL,
++ CLK_SET_RATE_PARENT, 0x37c4, 4, 0,
++ },
++ {
++ HI3519DV500_ETH_MACIF_CLK, "clk_eth_macif", NULL,
++ CLK_SET_RATE_PARENT, 0x37c0, 4, 0,
++ },
++ {
++ HI3519DV500_ETH1_CLK, "clk_eth1", NULL,
++ CLK_SET_RATE_PARENT, 0x3804, 4, 0,
++ },
++ {
++ HI3519DV500_ETH1_MACIF_CLK, "clk_eth1_macif", NULL,
++ CLK_SET_RATE_PARENT, 0x3800, 4, 0,
++ },
++ {
++ HI3519DV500_I2C0_CLK, "clk_i2c0", "i2c0_mux",
++ CLK_SET_RATE_PARENT, 0x4280, 4, 0,
++ },
++ {
++ HI3519DV500_I2C1_CLK, "clk_i2c1", "i2c1_mux",
++ CLK_SET_RATE_PARENT, 0x4288, 4, 0,
++ },
++ {
++ HI3519DV500_I2C2_CLK, "clk_i2c2", "i2c2_mux",
++ CLK_SET_RATE_PARENT, 0x4290, 4, 0,
++ },
++ {
++ HI3519DV500_I2C3_CLK, "clk_i2c3", "i2c3_mux",
++ CLK_SET_RATE_PARENT, 0x4298, 4, 0,
++ },
++ {
++ HI3519DV500_I2C4_CLK, "clk_i2c4", "i2c4_mux",
++ CLK_SET_RATE_PARENT, 0x42a0, 4, 0,
++ },
++ { HI3519DV500_I2C5_CLK, "clk_i2c5", "i2c5_mux",
++ CLK_SET_RATE_PARENT, 0x42a8, 4, 0,
++ },
++ { HI3519DV500_I2C6_CLK, "clk_i2c6", "i2c6_mux",
++ CLK_SET_RATE_PARENT, 0x42b0, 4, 0,
++ },
++ { HI3519DV500_I2C7_CLK, "clk_i2c7", "i2c7_mux",
++ CLK_SET_RATE_PARENT, 0x42b8, 4, 0,
++ },
++ /* spi */
++ {
++ HI3519DV500_SPI0_CLK, "clk_spi0", "100m",
++ CLK_SET_RATE_PARENT, 0x4480, 4, 0,
++ },
++ {
++ HI3519DV500_SPI1_CLK, "clk_spi1", "100m",
++ CLK_SET_RATE_PARENT, 0x4488, 4, 0,
++ },
++ {
++ HI3519DV500_SPI2_CLK, "clk_spi2", "100m",
++ CLK_SET_RATE_PARENT, 0x4490, 4, 0,
++ },
++ {
++ HI3519DV500_SPI3_CLK, "clk_spi3", "100m",
++ CLK_SET_RATE_PARENT, 0x4498, 4, 0,
++ },
++ {
++ HI3519DV500_EDMAC_AXICLK, "axi_clk_edmac", NULL,
++ CLK_SET_RATE_PARENT, 0x2a80, 5, 0,
++ },
++ {
++ HI3519DV500_EDMAC_CLK, "clk_edmac", NULL,
++ CLK_SET_RATE_PARENT, 0x2a80, 4, 0,
++ },
++ /* lsadc */
++ {
++ HI3519DV500_LSADC_CLK, "clk_lsadc", NULL,
++ CLK_SET_RATE_PARENT, 0x46c0, 4, 0,
++ },
++ /* pwm0 */
++ {
++ HI3519DV500_PWM0_CLK, "clk_pwm0", "pwm0_mux",
++ CLK_SET_RATE_PARENT, 0x4588, 4, 0,
++ },
++ /* pwm1 */
++ {
++ HI3519DV500_PWM1_CLK, "clk_pwm1", "pwm1_mux",
++ CLK_SET_RATE_PARENT, 0x4590, 4, 0,
++ },
++ /* pwm2 */
++ {
++ HI3519DV500_PWM2_CLK, "clk_pwm2", "pwm2_mux",
++ CLK_SET_RATE_PARENT, 0x4598, 4, 0,
++ },
++};
++
++static __init struct bsp_clock_data *hi3519dv500_clk_register(
++ struct platform_device *pdev)
++{
++ struct bsp_clock_data *clk_data = NULL;
++ int ret;
++
++ clk_data = bsp_clk_alloc(pdev, HI3519DV500_CRG_NR_CLKS);
++ if (clk_data == NULL)
++ return ERR_PTR(-ENOMEM);
++
++ ret = bsp_clk_register_fixed_rate(hi3519dv500_fixed_rate_clks_crg,
++ ARRAY_SIZE(hi3519dv500_fixed_rate_clks_crg), clk_data);
++ if (ret)
++ return ERR_PTR(ret);
++
++ ret = bsp_clk_register_mux(hi3519dv500_mux_clks_crg,
++ ARRAY_SIZE(hi3519dv500_mux_clks_crg),
++ clk_data);
++ if (ret)
++ goto unregister_fixed_rate;
++
++ ret = bsp_clk_register_fixed_factor(hi3519dv500_fixed_factor_clks,
++ ARRAY_SIZE(hi3519dv500_fixed_factor_clks), clk_data);
++ if (ret)
++ goto unregister_mux;
++
++ ret = bsp_clk_register_gate(hi3519dv500_gate_clks,
++ ARRAY_SIZE(hi3519dv500_gate_clks),
++ clk_data);
++ if (ret)
++ goto unregister_factor;
++
++ ret = of_clk_add_provider(pdev->dev.of_node,
++ of_clk_src_onecell_get, &clk_data->clk_data);
++ if (ret)
++ goto unregister_gate;
++
++ return clk_data;
++
++unregister_gate:
++ bsp_clk_unregister_gate(hi3519dv500_gate_clks,
++ ARRAY_SIZE(hi3519dv500_gate_clks), clk_data);
++unregister_factor:
++ bsp_clk_unregister_fixed_factor(hi3519dv500_fixed_factor_clks,
++ ARRAY_SIZE(hi3519dv500_fixed_factor_clks), clk_data);
++unregister_mux:
++ bsp_clk_unregister_mux(hi3519dv500_mux_clks_crg,
++ ARRAY_SIZE(hi3519dv500_mux_clks_crg),
++ clk_data);
++unregister_fixed_rate:
++ bsp_clk_unregister_fixed_rate(hi3519dv500_fixed_rate_clks_crg,
++ ARRAY_SIZE(hi3519dv500_fixed_rate_clks_crg), clk_data);
++ return ERR_PTR(ret);
++}
++
++static __init void hi3519dv500_clk_unregister(const struct platform_device *pdev)
++{
++ struct bsp_crg_dev *crg = platform_get_drvdata(pdev);
++
++ of_clk_del_provider(pdev->dev.of_node);
++
++ bsp_clk_unregister_gate(hi3519dv500_gate_clks,
++ ARRAY_SIZE(hi3519dv500_gate_clks), crg->clk_data);
++ bsp_clk_unregister_mux(hi3519dv500_mux_clks_crg,
++ ARRAY_SIZE(hi3519dv500_mux_clks_crg), crg->clk_data);
++ bsp_clk_unregister_fixed_factor(hi3519dv500_fixed_factor_clks,
++ ARRAY_SIZE(hi3519dv500_fixed_factor_clks), crg->clk_data);
++ bsp_clk_unregister_fixed_rate(hi3519dv500_fixed_rate_clks_crg,
++ ARRAY_SIZE(hi3519dv500_fixed_rate_clks_crg), crg->clk_data);
++}
++
++static const struct bsp_crg_funcs hi3519dv500_crg_funcs = {
++ .register_clks = hi3519dv500_clk_register,
++ .unregister_clks = hi3519dv500_clk_unregister,
++};
++
++
++static const struct of_device_id hi3519dv500_crg_match_table[] = {
++ {
++ .compatible = "vendor,hi3519dv500_clock",
++ .data = &hi3519dv500_crg_funcs
++ },
++ { }
++};
++MODULE_DEVICE_TABLE(of, hi3519dv500_crg_match_table);
++
++static int hi3519dv500_crg_probe(struct platform_device *pdev)
++{
++ struct bsp_crg_dev *crg = NULL;
++
++ crg = devm_kmalloc(&pdev->dev, sizeof(*crg), GFP_KERNEL);
++ if (crg == NULL)
++ return -ENOMEM;
++
++ crg->funcs = of_device_get_match_data(&pdev->dev);
++ if (crg->funcs == NULL)
++ return -ENOENT;
++
++ crg->rstc = vendor_reset_init(pdev);
++ if (crg->rstc == NULL)
++ return -ENOMEM;
++
++ crg->clk_data = crg->funcs->register_clks(pdev);
++ if (IS_ERR(crg->clk_data)) {
++ bsp_reset_exit(crg->rstc);
++ return PTR_ERR(crg->clk_data);
++ }
++
++ platform_set_drvdata(pdev, crg);
++ return 0;
++}
++
++static int hi3519dv500_crg_remove(struct platform_device *pdev)
++{
++ struct bsp_crg_dev *crg = platform_get_drvdata(pdev);
++
++ bsp_reset_exit(crg->rstc);
++ crg->funcs->unregister_clks(pdev);
++ return 0;
++}
++
++static struct platform_driver hi3519dv500_crg_driver = {
++ .probe = hi3519dv500_crg_probe,
++ .remove = hi3519dv500_crg_remove,
++ .driver = {
++ .name = "hi3519dv500_clock",
++ .of_match_table = hi3519dv500_crg_match_table,
++ },
++};
++
++static int __init hi3519dv500_crg_init(void)
++{
++ return platform_driver_register(&hi3519dv500_crg_driver);
++}
++core_initcall(hi3519dv500_crg_init);
++
++static void __exit hi3519dv500_crg_exit(void)
++{
++ platform_driver_unregister(&hi3519dv500_crg_driver);
++}
++module_exit(hi3519dv500_crg_exit);
++
++MODULE_LICENSE("GPL v2");
++MODULE_DESCRIPTION("HiSilicon HI3519DV500 CRG Driver");
+diff --git a/drivers/clk/vendor/clk_ss928v100.c b/drivers/clk/vendor/clk_ss928v100.c
+new file mode 100644
+index 000000000000..952741837aaa
+--- /dev/null
++++ b/drivers/clk/vendor/clk_ss928v100.c
+@@ -0,0 +1,693 @@
++/*
++ * SS928V100 Clock Driver
++ *
++ * Copyright (c) 2016-2017 Shenshu Technologies Co., Ltd.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program. If not, see .
++ *
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++
++#include "clk.h"
++#include "crg.h"
++#include "reset.h"
++
++struct ss928v100_pll_clock {
++ u32 id;
++ const char *name;
++ const char *parent_name;
++ u32 ctrl_reg1;
++ u8 frac_shift;
++ u8 frac_width;
++ u8 postdiv1_shift;
++ u8 postdiv1_width;
++ u8 postdiv2_shift;
++ u8 postdiv2_width;
++ u32 ctrl_reg2;
++ u8 fbdiv_shift;
++ u8 fbdiv_width;
++ u8 refdiv_shift;
++ u8 refdiv_width;
++};
++
++struct ss928v100_clk_pll {
++ struct clk_hw hw;
++ u32 id;
++ void __iomem *ctrl_reg1;
++ u8 frac_shift;
++ u8 frac_width;
++ u8 postdiv1_shift;
++ u8 postdiv1_width;
++ u8 postdiv2_shift;
++ u8 postdiv2_width;
++ void __iomem *ctrl_reg2;
++ u8 fbdiv_shift;
++ u8 fbdiv_width;
++ u8 refdiv_shift;
++ u8 refdiv_width;
++};
++
++/* soc clk config */
++static const struct bsp_fixed_rate_clock ss928v100_fixed_rate_clks_crg[] = {
++ { SS928V100_FIXED_2400M, "2400m", NULL, 0, 2400000000, },
++ { SS928V100_FIXED_1200M, "1200m", NULL, 0, 1200000000, },
++ { SS928V100_FIXED_1188M, "1188m", NULL, 0, 1188000000, },
++ { SS928V100_FIXED_896M, "896m", NULL, 0, 896000000, },
++ { SS928V100_FIXED_800M, "800m", NULL, 0, 800000000, },
++ { SS928V100_FIXED_792M, "792m", NULL, 0, 792000000, },
++ { SS928V100_FIXED_786M, "786m", NULL, 0, 786000000, },
++ { SS928V100_FIXED_750M, "750m", NULL, 0, 750000000, },
++ { SS928V100_FIXED_700M, "700m", NULL, 0, 700000000, },
++ { SS928V100_FIXED_672M, "672m", NULL, 0, 672000000, },
++ { SS928V100_FIXED_600M, "600m", NULL, 0, 600000000, },
++ { SS928V100_FIXED_594M, "594m", NULL, 0, 594000000, },
++ { SS928V100_FIXED_560M, "560m", NULL, 0, 560000000, },
++ { SS928V100_FIXED_500M, "500m", NULL, 0, 500000000, },
++ { SS928V100_FIXED_475M, "475m", NULL, 0, 475000000, },
++ { SS928V100_FIXED_396M, "396m", NULL, 0, 396000000, },
++ { SS928V100_FIXED_300M, "300m", NULL, 0, 300000000, },
++ { SS928V100_FIXED_297M, "297m", NULL, 0, 297000000, },
++ { SS928V100_FIXED_257M, "257m", NULL, 0, 257000000, },
++ { SS928V100_FIXED_250M, "250m", NULL, 0, 250000000, },
++ { SS928V100_FIXED_200M, "200m", NULL, 0, 200000000, },
++ { SS928V100_FIXED_198M, "198m", NULL, 0, 198000000, },
++ { SS928V100_FIXED_187P_5M, "187p5m", NULL, 0, 187500000, },
++ { SS928V100_FIXED_150M, "150m", NULL, 0, 150000000, },
++ { SS928V100_FIXED_148P_5M, "148p5m", NULL, 0, 148500000, },
++ { SS928V100_FIXED_134M, "134m", NULL, 0, 134000000, },
++ { SS928V100_FIXED_108M, "108m", NULL, 0, 108000000, },
++ { SS928V100_FIXED_100M, "100m", NULL, 0, 100000000, },
++ { SS928V100_FIXED_99M, "99m", NULL, 0, 99000000, },
++ { SS928V100_FIXED_74P_25M, "74p25m", NULL, 0, 74250000, },
++ { SS928V100_FIXED_72M, "72m", NULL, 0, 72000000, },
++ { SS928V100_FIXED_64M, "64m", NULL, 0, 64000000, },
++ { SS928V100_FIXED_60M, "60m", NULL, 0, 60000000, },
++ { SS928V100_FIXED_54M, "54m", NULL, 0, 54000000, },
++ { SS928V100_FIXED_50M, "50m", NULL, 0, 50000000, },
++ { SS928V100_FIXED_49P_5M, "49p5m", NULL, 0, 49500000, },
++ { SS928V100_FIXED_37P_125M, "37p125m", NULL, 0, 37125000, },
++ { SS928V100_FIXED_36M, "36m", NULL, 0, 36000000, },
++ { SS928V100_FIXED_27M, "27m", NULL, 0, 27000000, },
++ { SS928V100_FIXED_25M, "25m", NULL, 0, 25000000, },
++ { SS928V100_FIXED_24M, "24m", NULL, 0, 24000000, },
++ { SS928V100_FIXED_12M, "12m", NULL, 0, 12000000, },
++ { SS928V100_FIXED_12P_288M, "12p288m", NULL, 0, 12288000, },
++ { SS928V100_FIXED_6M, "6m", NULL, 0, 6000000, },
++ { SS928V100_FIXED_3M, "3m", NULL, 0, 3000000, },
++ { SS928V100_FIXED_1P_6M, "1p6m", NULL, 0, 1600000, },
++ { SS928V100_FIXED_400K, "400k", NULL, 0, 400000, },
++ { SS928V100_FIXED_100K, "100k", NULL, 0, 100000, },
++};
++
++
++static const char *fmc_mux_p[] __initdata = {
++ "24m", "99m", "148p5m", "198m", "250m", "297m", "396m"
++};
++static u32 fmc_mux_table[] = {0, 1, 2, 3, 4, 5, 6};
++
++static const char *mmc_mux_p[] __initdata = {
++ "400k", "25m", "50m", "100m", "150m", "187p5m", "200m"
++};
++static u32 mmc_mux_table[] = {0, 1, 2, 3, 4, 5, 6};
++
++static const char *sdio0_mux_p[] __initdata = {
++ "400k", "25m", "50m", "100m", "150m", "187p5m", "200m"
++};
++static u32 sdio0_mux_table[] = {0, 1, 2, 3, 4, 5, 6};
++
++static const char *sdio1_mux_p[] __initdata = {
++ "400k", "25m", "50m", "100m", "150m", "187p5m", "200m"
++};
++static u32 sdio1_mux_table[] = {0, 1, 2, 3, 4, 5, 6};
++
++static const char *hpaxi_mux_p[] __initdata = {
++ "24m", "396m", "475m"
++};
++static u32 hpaxi_mux_table[] = {0, 1, 2};
++
++static const char *ddraxi_mux_p[] __initdata = {
++ "24m", "500m", "672m", "750m"
++};
++static u32 ddraxi_mux_table[] = {0, 1, 2, 3};
++
++static const char *uart_mux_p[] __initdata = {"50m", "24m", "3m", "100m"};
++static u32 uart_mux_table[] = {0, 1, 2, 3};
++
++static const char *i2c_mux_p[] __initdata = {
++ "50m", "100m"
++};
++static u32 i2c_mux_table[] = {0, 1};
++
++static const char * pwm0_mux_p[] __initdata = {"200m"};
++static u32 pwm0_mux_table[] = {0};
++
++static const char * pwm1_mux_p[] __initdata = {"200m"};
++static u32 pwm1_mux_table[] = {0};
++
++static struct bsp_mux_clock ss928v100_mux_clks_crg[] __initdata = {
++ {
++ SS928V100_FMC_MUX, "fmc_mux",
++ fmc_mux_p, ARRAY_SIZE(fmc_mux_p),
++ CLK_SET_RATE_PARENT, 0x3f40, 12, 3, 0, fmc_mux_table,
++ },
++ {
++ SS928V100_MMC0_MUX, "mmc0_mux",
++ mmc_mux_p, ARRAY_SIZE(mmc_mux_p),
++ CLK_SET_RATE_PARENT, 0x34c0, 24, 3, 0, mmc_mux_table,
++ },
++ {
++ SS928V100_MMC1_MUX, "mmc1_mux",
++ sdio0_mux_p, ARRAY_SIZE(sdio0_mux_p),
++ CLK_SET_RATE_PARENT, 0x35c0, 24, 3, 0, sdio0_mux_table,
++ },
++ {
++ SS928V100_MMC2_MUX, "mmc2_mux",
++ sdio1_mux_p, ARRAY_SIZE(sdio1_mux_p),
++ CLK_SET_RATE_PARENT, 0x36c0, 24, 3, 0, sdio1_mux_table,
++ },
++ {
++ SS928V100_HPAXI_MUX, "hpaxi_mux",
++ hpaxi_mux_p, ARRAY_SIZE(hpaxi_mux_p),
++ CLK_SET_RATE_PARENT, 0x2000, 16, 2, 0, hpaxi_mux_table
++ },
++ {
++ SS928V100_DDRAXI_MUX, "ddraxi_mux",
++ ddraxi_mux_p, ARRAY_SIZE(ddraxi_mux_p),
++ CLK_SET_RATE_PARENT, 0x2000, 12, 2, 0, ddraxi_mux_table
++ },
++ {
++ SS928V100_UART0_MUX, "uart0_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x4180, 12, 2, 0, uart_mux_table
++ },
++ {
++ SS928V100_UART1_MUX, "uart1_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x4188, 12, 2, 0, uart_mux_table
++ },
++ {
++ SS928V100_UART2_MUX, "uart2_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x4190, 12, 2, 0, uart_mux_table
++ },
++ {
++ SS928V100_UART3_MUX, "uart3_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x4198, 12, 2, 0, uart_mux_table
++ },
++ {
++ SS928V100_UART4_MUX, "uart4_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x41a0, 12, 2, 0, uart_mux_table
++ },
++ {
++ SS928V100_UART5_MUX, "uart5_mux",
++ uart_mux_p, ARRAY_SIZE(uart_mux_p),
++ CLK_SET_RATE_PARENT, 0x41a8, 12, 2, 0, uart_mux_table
++ },
++ {
++ SS928V100_I2C0_MUX, "i2c0_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x4280, 12, 1, 0, i2c_mux_table
++ },
++ {
++ SS928V100_I2C1_MUX, "i2c1_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x4288, 12, 1, 0, i2c_mux_table
++ },
++ {
++ SS928V100_I2C2_MUX, "i2c2_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x4290, 12, 1, 0, i2c_mux_table
++ },
++ {
++ SS928V100_I2C3_MUX, "i2c3_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x4298, 12, 1, 0, i2c_mux_table
++ },
++ {
++ SS928V100_I2C4_MUX, "i2c4_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x42a0, 12, 1, 0, i2c_mux_table
++ },
++ {
++ SS928V100_I2C5_MUX, "i2c5_mux",
++ i2c_mux_p, ARRAY_SIZE(i2c_mux_p),
++ CLK_SET_RATE_PARENT, 0x42a8, 12, 1, 0, i2c_mux_table
++ },
++ {
++ SS928V100_PWM0_MUX, "pwm0_mux",
++ pwm0_mux_p, ARRAY_SIZE(pwm0_mux_p),
++ CLK_SET_RATE_PARENT, 0x4588, 12, 2, 0, pwm0_mux_table
++ },
++ {
++ SS928V100_PWM1_MUX, "pwm1_mux",
++ pwm1_mux_p, ARRAY_SIZE(pwm1_mux_p),
++ CLK_SET_RATE_PARENT, 0x4590, 12, 2, 0, pwm1_mux_table
++ },
++};
++
++static struct bsp_fixed_factor_clock
++ ss928v100_fixed_factor_clks[] __initdata = {
++};
++
++static struct bsp_gate_clock ss928v100_gate_clks[] __initdata = {
++ {
++ SS928V100_FMC_CLK, "clk_fmc", "fmc_mux",
++ CLK_SET_RATE_PARENT, 0x3f40, 4, 0,
++ },
++ {
++ SS928V100_MMC0_CLK, "clk_mmc0", "mmc0_mux",
++ CLK_SET_RATE_PARENT, 0x34c0, 0, 0,
++ },
++ {
++ SS928V100_MMC1_CLK, "clk_mmc1", "mmc1_mux",
++ CLK_SET_RATE_PARENT, 0x35c0, 0, 0,
++ },
++ {
++ SS928V100_MMC2_CLK, "clk_mmc2", "mmc2_mux",
++ CLK_SET_RATE_PARENT, 0x36c0, 0, 0,
++ },
++ {
++ SS928V100_UART0_CLK, "clk_uart0", "uart0_mux",
++ CLK_SET_RATE_PARENT, 0x4180, 4, 0,
++ },
++ {
++ SS928V100_UART1_CLK, "clk_uart1", "uart1_mux",
++ CLK_SET_RATE_PARENT, 0x4188, 4, 0,
++ },
++ {
++ SS928V100_UART2_CLK, "clk_uart2", "uart2_mux",
++ CLK_SET_RATE_PARENT, 0x4190, 4, 0,
++ },
++ {
++ SS928V100_UART3_CLK, "clk_uart3", "uart3_mux",
++ CLK_SET_RATE_PARENT, 0x4198, 4, 0,
++ },
++ {
++ SS928V100_UART4_CLK, "clk_uart4", "uart4_mux",
++ CLK_SET_RATE_PARENT, 0x41A0, 4, 0,
++ },
++ {
++ SS928V100_UART5_CLK, "clk_uart5", "uart5_mux",
++ CLK_SET_RATE_PARENT, 0x41a8, 4, 0,
++ },
++ /* ethernet mac */
++ {
++ SS928V100_ETH_CLK, "clk_eth", NULL,
++ CLK_SET_RATE_PARENT, 0x37c4, 4, 0,
++ },
++ {
++ SS928V100_ETH_MACIF_CLK, "clk_eth_macif", NULL,
++ CLK_SET_RATE_PARENT, 0x37c0, 4, 0,
++ },
++ {
++ SS928V100_ETH1_CLK, "clk_eth1", NULL,
++ CLK_SET_RATE_PARENT, 0x3804, 4, 0,
++ },
++ {
++ SS928V100_ETH1_MACIF_CLK, "clk_eth1_macif", NULL,
++ CLK_SET_RATE_PARENT, 0x3800, 4, 0,
++ },
++ {
++ SS928V100_I2C0_CLK, "clk_i2c0", "i2c0_mux",
++ CLK_SET_RATE_PARENT, 0x4280, 4, 0,
++ },
++ {
++ SS928V100_I2C1_CLK, "clk_i2c1", "i2c1_mux",
++ CLK_SET_RATE_PARENT, 0x4288, 4, 0,
++ },
++ {
++ SS928V100_I2C2_CLK, "clk_i2c2", "i2c2_mux",
++ CLK_SET_RATE_PARENT, 0x4290, 4, 0,
++ },
++ {
++ SS928V100_I2C3_CLK, "clk_i2c3", "i2c3_mux",
++ CLK_SET_RATE_PARENT, 0x4298, 4, 0,
++ },
++ {
++ SS928V100_I2C4_CLK, "clk_i2c4", "i2c4_mux",
++ CLK_SET_RATE_PARENT, 0x42a0, 4, 0,
++ },
++ { SS928V100_I2C5_CLK, "clk_i2c5", "i2c5_mux",
++ CLK_SET_RATE_PARENT, 0x42a8, 4, 0,
++ },
++ /* spi */
++ {
++ SS928V100_SPI0_CLK, "clk_spi0", "100m",
++ CLK_SET_RATE_PARENT, 0x4480, 4, 0,
++ },
++ {
++ SS928V100_SPI1_CLK, "clk_spi1", "100m",
++ CLK_SET_RATE_PARENT, 0x4488, 4, 0,
++ },
++ {
++ SS928V100_SPI2_CLK, "clk_spi2", "100m",
++ CLK_SET_RATE_PARENT, 0x4490, 4, 0,
++ },
++ {
++ SS928V100_SPI3_CLK, "clk_spi3", "100m",
++ CLK_SET_RATE_PARENT, 0x4498, 4, 0,
++ },
++ {
++ SS928V100_EDMAC_AXICLK, "axi_clk_edmac", NULL,
++ CLK_SET_RATE_PARENT, 0x2a80, 5, 0,
++ },
++ {
++ SS928V100_EDMAC_CLK, "clk_edmac", NULL,
++ CLK_SET_RATE_PARENT, 0x2a80, 4, 0,
++ },
++ /* lsadc */
++ {
++ SS928V100_LSADC_CLK, "clk_lsadc", NULL,
++ CLK_SET_RATE_PARENT, 0x46c0, 4, 0,
++ },
++ /* pwm0 */
++ {
++ SS928V100_PWM0_CLK, "clk_pwm0", "pwm0_mux",
++ CLK_SET_RATE_PARENT, 0x4588, 4, 0,
++ },
++ /* pwm1 */
++ {
++ SS928V100_PWM1_CLK, "clk_pwm1", "pwm1_mux",
++ CLK_SET_RATE_PARENT, 0x4590, 4, 0,
++ },
++};
++
++static struct ss928v100_pll_clock ss928v100_pll_clks[] __initdata = {
++ {
++ SS928V100_APLL_CLK, "apll", NULL, 0x0, 0, 24, 24, 3, 28, 3,
++ 0x4, 0, 12, 12, 6
++ },
++};
++
++#define to_pll_clk(_hw) container_of(_hw, struct ss928v100_clk_pll, hw)
++static void ss928v100_calc_pll(u32 *frac_val, u32 *fbdiv_val,
++ u32 *refdiv_val, u64 rate)
++{
++ u64 rem;
++ *frac_val = 0;
++ /* Frequency divided by 1000000 can be converted from Hz to MHz. */
++ rem = do_div(rate, 1000000);
++ /* rate/24 is the integral part of the frequency multiplication coefficient. */
++ *fbdiv_val = rate / 24;
++ *refdiv_val = 1;
++ /* 2 to the 24th power */
++ rem = rem * (1 << 24);
++ /* Frequency divided by 1000000 can be converted from Hz to MHz. */
++ do_div(rem, 1000000);
++ *frac_val = rem;
++}
++
++static int clk_pll_set_rate(struct clk_hw *hw,
++ unsigned long rate,
++ unsigned long parent_rate)
++{
++ struct ss928v100_clk_pll *clk = to_pll_clk(hw);
++ u32 frac_val, postdiv1_val, postdiv2_val, fbdiv_val, refdiv_val;
++ u32 val;
++
++ /*Fixme ignore postdives now because apll don't use them*/
++ postdiv1_val = postdiv2_val = 0;
++
++ ss928v100_calc_pll(&frac_val, &fbdiv_val, &refdiv_val, (u64)rate);
++
++ val = readl_relaxed(clk->ctrl_reg1);
++ val &= ~(((1 << clk->frac_width) - 1) << clk->frac_shift);
++ val &= ~(((1 << clk->postdiv1_width) - 1) << clk->postdiv1_shift);
++ val &= ~(((1 << clk->postdiv2_width) - 1) << clk->postdiv2_shift);
++
++ val |= frac_val << clk->frac_shift;
++ val |= postdiv1_val << clk->postdiv1_shift;
++ val |= postdiv2_val << clk->postdiv2_shift;
++ writel_relaxed(val, clk->ctrl_reg1);
++
++ val = readl_relaxed(clk->ctrl_reg2);
++ val &= ~(((1 << clk->fbdiv_width) - 1) << clk->fbdiv_shift);
++ val &= ~(((1 << clk->refdiv_width) - 1) << clk->refdiv_shift);
++
++ val |= fbdiv_val << clk->fbdiv_shift;
++ val |= refdiv_val << clk->refdiv_shift;
++ writel_relaxed(val, clk->ctrl_reg2);
++
++ return 0;
++}
++
++static unsigned long clk_pll_recalc_rate(struct clk_hw *hw,
++ unsigned long parent_rate)
++{
++ struct ss928v100_clk_pll *clk = to_pll_clk(hw);
++ u64 frac_val, fbdiv_val, refdiv_val;
++ u32 val;
++ u64 tmp, rate;
++
++ val = readl_relaxed(clk->ctrl_reg1);
++ val = val >> clk->frac_shift;
++ val &= ((1 << clk->frac_width) - 1);
++ frac_val = val;
++
++ val = readl_relaxed(clk->ctrl_reg2);
++ val = val >> clk->fbdiv_shift;
++ val &= ((1 << clk->fbdiv_width) - 1);
++ fbdiv_val = val;
++
++ val = readl_relaxed(clk->ctrl_reg2);
++ val = val >> clk->refdiv_shift;
++ val &= ((1 << clk->refdiv_width) - 1);
++ refdiv_val = val;
++
++ rate = 0;
++ /* rate = 24000000 * (fbdiv + frac / (1<<24) ) / refdiv */
++ tmp = 24000000 * fbdiv_val;
++ rate += tmp;
++ do_div(rate, refdiv_val);
++
++ return rate;
++}
++
++static int clk_pll_determine_rate(struct clk_hw *hw,
++ struct clk_rate_request *req)
++{
++ return req->rate;
++}
++
++static struct clk_ops clk_pll_ops = {
++ .set_rate = clk_pll_set_rate,
++ .determine_rate = clk_pll_determine_rate,
++ .recalc_rate = clk_pll_recalc_rate,
++};
++
++void clk_register_pll(const struct ss928v100_pll_clock *clks,
++ int nums, const struct bsp_clock_data *data)
++{
++ void __iomem *base = data->base;
++ int i;
++
++ for (i = 0; i < nums; i++) {
++ struct ss928v100_clk_pll *p_clk = NULL;
++ struct clk *clk = NULL;
++ struct clk_init_data init;
++
++ p_clk = kzalloc(sizeof(*p_clk), GFP_KERNEL);
++ if (p_clk == NULL)
++ return;
++
++ init.name = clks[i].name;
++ init.flags = CLK_IS_BASIC;
++ init.parent_names =
++ (clks[i].parent_name ? &clks[i].parent_name : NULL);
++ init.num_parents = (clks[i].parent_name ? 1 : 0);
++ init.ops = &clk_pll_ops;
++
++ p_clk->ctrl_reg1 = base + clks[i].ctrl_reg1;
++ p_clk->frac_shift = clks[i].frac_shift;
++ p_clk->frac_width = clks[i].frac_width;
++ p_clk->postdiv1_shift = clks[i].postdiv1_shift;
++ p_clk->postdiv1_width = clks[i].postdiv1_width;
++ p_clk->postdiv2_shift = clks[i].postdiv2_shift;
++ p_clk->postdiv2_width = clks[i].postdiv2_width;
++
++ p_clk->ctrl_reg2 = base + clks[i].ctrl_reg2;
++ p_clk->fbdiv_shift = clks[i].fbdiv_shift;
++ p_clk->fbdiv_width = clks[i].fbdiv_width;
++ p_clk->refdiv_shift = clks[i].refdiv_shift;
++ p_clk->refdiv_width = clks[i].refdiv_width;
++ p_clk->hw.init = &init;
++
++ clk = clk_register(NULL, &p_clk->hw);
++ if (IS_ERR(clk)) {
++ kfree(p_clk);
++ pr_err("%s: failed to register clock %s\n",
++ __func__, clks[i].name);
++ continue;
++ }
++
++ data->clk_data.clks[clks[i].id] = clk;
++ }
++}
++
++static __init struct bsp_clock_data *ss928v100_clk_register(
++ struct platform_device *pdev)
++{
++ struct bsp_clock_data *clk_data = NULL;
++ int ret;
++
++ clk_data = bsp_clk_alloc(pdev, SS928V100_CRG_NR_CLKS);
++ if (clk_data == NULL)
++ return ERR_PTR(-ENOMEM);
++
++ ret = bsp_clk_register_fixed_rate(ss928v100_fixed_rate_clks_crg,
++ ARRAY_SIZE(ss928v100_fixed_rate_clks_crg), clk_data);
++ if (ret)
++ return ERR_PTR(ret);
++
++ clk_register_pll(ss928v100_pll_clks,
++ ARRAY_SIZE(ss928v100_pll_clks), clk_data);
++
++ ret = bsp_clk_register_mux(ss928v100_mux_clks_crg,
++ ARRAY_SIZE(ss928v100_mux_clks_crg),
++ clk_data);
++ if (ret)
++ goto unregister_fixed_rate;
++
++ ret = bsp_clk_register_fixed_factor(ss928v100_fixed_factor_clks,
++ ARRAY_SIZE(ss928v100_fixed_factor_clks), clk_data);
++ if (ret)
++ goto unregister_mux;
++
++ ret = bsp_clk_register_gate(ss928v100_gate_clks,
++ ARRAY_SIZE(ss928v100_gate_clks),
++ clk_data);
++ if (ret)
++ goto unregister_factor;
++
++ ret = of_clk_add_provider(pdev->dev.of_node,
++ of_clk_src_onecell_get, &clk_data->clk_data);
++ if (ret)
++ goto unregister_gate;
++
++ return clk_data;
++
++unregister_gate:
++ bsp_clk_unregister_gate(ss928v100_gate_clks,
++ ARRAY_SIZE(ss928v100_gate_clks), clk_data);
++unregister_factor:
++ bsp_clk_unregister_fixed_factor(ss928v100_fixed_factor_clks,
++ ARRAY_SIZE(ss928v100_fixed_factor_clks), clk_data);
++unregister_mux:
++ bsp_clk_unregister_mux(ss928v100_mux_clks_crg,
++ ARRAY_SIZE(ss928v100_mux_clks_crg),
++ clk_data);
++unregister_fixed_rate:
++ bsp_clk_unregister_fixed_rate(ss928v100_fixed_rate_clks_crg,
++ ARRAY_SIZE(ss928v100_fixed_rate_clks_crg), clk_data);
++ return ERR_PTR(ret);
++}
++
++static __init void ss928v100_clk_unregister(const struct platform_device *pdev)
++{
++ struct bsp_crg_dev *crg = platform_get_drvdata(pdev);
++
++ of_clk_del_provider(pdev->dev.of_node);
++
++ bsp_clk_unregister_gate(ss928v100_gate_clks,
++ ARRAY_SIZE(ss928v100_gate_clks), crg->clk_data);
++ bsp_clk_unregister_mux(ss928v100_mux_clks_crg,
++ ARRAY_SIZE(ss928v100_mux_clks_crg), crg->clk_data);
++ bsp_clk_unregister_fixed_factor(ss928v100_fixed_factor_clks,
++ ARRAY_SIZE(ss928v100_fixed_factor_clks), crg->clk_data);
++ bsp_clk_unregister_fixed_rate(ss928v100_fixed_rate_clks_crg,
++ ARRAY_SIZE(ss928v100_fixed_rate_clks_crg), crg->clk_data);
++}
++
++static const struct bsp_crg_funcs ss928v100_crg_funcs = {
++ .register_clks = ss928v100_clk_register,
++ .unregister_clks = ss928v100_clk_unregister,
++};
++
++
++static const struct of_device_id ss928v100_crg_match_table[] = {
++ {
++ .compatible = "vendor,ss928v100_clock",
++ .data = &ss928v100_crg_funcs
++ },
++ { }
++};
++MODULE_DEVICE_TABLE(of, ss928v100_crg_match_table);
++
++static int ss928v100_crg_probe(struct platform_device *pdev)
++{
++ printk("ss928v100 clock driver probe\n");
++ struct bsp_crg_dev *crg = NULL;
++
++ crg = devm_kmalloc(&pdev->dev, sizeof(*crg), GFP_KERNEL);
++ if (crg == NULL)
++ return -ENOMEM;
++
++ crg->funcs = of_device_get_match_data(&pdev->dev);
++ if (crg->funcs == NULL)
++ return -ENOENT;
++
++ crg->rstc = vendor_reset_init(pdev);
++ if (crg->rstc == NULL)
++ return -ENOMEM;
++
++ crg->clk_data = crg->funcs->register_clks(pdev);
++ if (IS_ERR(crg->clk_data)) {
++ bsp_reset_exit(crg->rstc);
++ return PTR_ERR(crg->clk_data);
++ }
++
++ platform_set_drvdata(pdev, crg);
++ return 0;
++}
++
++static int ss928v100_crg_remove(struct platform_device *pdev)
++{
++ struct bsp_crg_dev *crg = platform_get_drvdata(pdev);
++
++ bsp_reset_exit(crg->rstc);
++ crg->funcs->unregister_clks(pdev);
++ return 0;
++}
++
++static struct platform_driver ss928v100_crg_driver = {
++ .probe = ss928v100_crg_probe,
++ .remove = ss928v100_crg_remove,
++ .driver = {
++ .name = "ss928v100_clock",
++ .of_match_table = ss928v100_crg_match_table,
++ },
++};
++
++static int __init ss928v100_crg_init(void)
++{
++ return platform_driver_register(&ss928v100_crg_driver);
++}
++core_initcall(ss928v100_crg_init);
++
++static void __exit ss928v100_crg_exit(void)
++{
++ platform_driver_unregister(&ss928v100_crg_driver);
++}
++module_exit(ss928v100_crg_exit);
++
++MODULE_LICENSE("GPL v2");
++MODULE_DESCRIPTION("SS928V100 CRG Driver");
+diff --git a/drivers/clk/vendor/clkgate_separated.c b/drivers/clk/vendor/clkgate_separated.c
+new file mode 100644
+index 000000000000..d53783fb317e
+--- /dev/null
++++ b/drivers/clk/vendor/clkgate_separated.c
+@@ -0,0 +1,108 @@
++/*
++ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2020-2023. All rights reserved.
++ */
++
++#include
++#include
++#include
++#include
++
++#include "clk.h"
++
++/* clock separated gate register offset */
++#define CLKGATE_SEPERATED_ENABLE 0x0
++#define CLKGATE_SEPERATED_DISABLE 0x4
++#define CLKGATE_SEPERATED_STATUS 0x8
++
++struct clkgate_separated {
++ struct clk_hw hw;
++ void __iomem *enable; /* enable register */
++ u8 bit_idx; /* bits in enable/disable register */
++ u8 flags;
++ spinlock_t *lock;
++};
++
++static int clkgate_separated_enable(struct clk_hw *hw)
++{
++ struct clkgate_separated *sclk;
++ unsigned long flags = 0;
++ u32 reg;
++
++ sclk = container_of(hw, struct clkgate_separated, hw);
++ if (sclk->lock)
++ spin_lock_irqsave(sclk->lock, flags);
++ reg = BIT(sclk->bit_idx);
++ writel_relaxed(reg, sclk->enable);
++ readl_relaxed(sclk->enable + CLKGATE_SEPERATED_STATUS);
++ if (sclk->lock)
++ spin_unlock_irqrestore(sclk->lock, flags);
++ return 0;
++}
++
++static void clkgate_separated_disable(struct clk_hw *hw)
++{
++ struct clkgate_separated *sclk;
++ unsigned long flags = 0;
++ u32 reg;
++
++ sclk = container_of(hw, struct clkgate_separated, hw);
++ if (sclk->lock)
++ spin_lock_irqsave(sclk->lock, flags);
++ reg = BIT(sclk->bit_idx);
++ writel_relaxed(reg, sclk->enable + CLKGATE_SEPERATED_DISABLE);
++ readl_relaxed(sclk->enable + CLKGATE_SEPERATED_STATUS);
++ if (sclk->lock)
++ spin_unlock_irqrestore(sclk->lock, flags);
++}
++
++static int clkgate_separated_is_enabled(struct clk_hw *hw)
++{
++ struct clkgate_separated *sclk;
++ u32 reg;
++
++ sclk = container_of(hw, struct clkgate_separated, hw);
++ reg = readl_relaxed(sclk->enable + CLKGATE_SEPERATED_STATUS);
++ reg &= BIT(sclk->bit_idx);
++ if (reg)
++ return 1;
++ else
++ return 0;
++}
++
++static const struct clk_ops clkgate_separated_ops = {
++ .enable = clkgate_separated_enable,
++ .disable = clkgate_separated_disable,
++ .is_enabled = clkgate_separated_is_enabled,
++};
++
++struct clk *bsp_register_clkgate_sep(struct device *dev, const char *name,
++ const char *parent_name,
++ unsigned long flags,
++ void __iomem *reg, u8 bit_idx,
++ u8 clk_gate_flags, spinlock_t *lock)
++{
++ struct clkgate_separated *sclk;
++ struct clk *clk;
++ struct clk_init_data init;
++
++ sclk = kzalloc(sizeof(*sclk), GFP_KERNEL);
++ if (!sclk)
++ return ERR_PTR(-ENOMEM);
++
++ init.name = name;
++ init.ops = &clkgate_separated_ops;
++ init.flags = flags;
++ init.parent_names = (parent_name ? &parent_name : NULL);
++ init.num_parents = (parent_name ? 1 : 0);
++
++ sclk->enable = reg + CLKGATE_SEPERATED_ENABLE;
++ sclk->bit_idx = bit_idx;
++ sclk->flags = clk_gate_flags;
++ sclk->hw.init = &init;
++ sclk->lock = lock;
++
++ clk = clk_register(dev, &sclk->hw);
++ if (IS_ERR(clk))
++ kfree(sclk);
++ return clk;
++}
+diff --git a/drivers/clk/vendor/crg.h b/drivers/clk/vendor/crg.h
+new file mode 100644
+index 000000000000..de73c36ad2b6
+--- /dev/null
++++ b/drivers/clk/vendor/crg.h
+@@ -0,0 +1,24 @@
++/*
++ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2020-2023. All rights reserved.
++ */
++
++#ifndef __BSP_CRG_H
++#define __BSP_CRG_H
++
++#include
++
++struct bsp_clock_data;
++struct bsp_reset_controller;
++
++struct bsp_crg_funcs {
++ struct bsp_clock_data* (*register_clks)(struct platform_device *pdev);
++ void (*unregister_clks)(const struct platform_device *pdev);
++};
++
++struct bsp_crg_dev {
++ struct bsp_clock_data *clk_data;
++ struct bsp_reset_controller *rstc;
++ const struct bsp_crg_funcs *funcs;
++};
++
++#endif /* __BSP_CRG_H */
+diff --git a/drivers/clk/vendor/reset.c b/drivers/clk/vendor/reset.c
+new file mode 100644
+index 000000000000..b8c610bb7f4f
+--- /dev/null
++++ b/drivers/clk/vendor/reset.c
+@@ -0,0 +1,145 @@
++/*
++ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2020-2023. All rights reserved.
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include "reset.h"
++
++#define BSP_RESET_BIT_MASK 0x1f
++#define BSP_RESET_OFFSET_SHIFT 8
++#define BSP_RESET_OFFSET_MASK 0xffff00
++
++struct bsp_reset_controller {
++ spinlock_t lock;
++ void __iomem *membase;
++ struct reset_controller_dev rcdev;
++};
++
++static int bsp_reset_of_xlate(struct reset_controller_dev *rcdev,
++ const struct of_phandle_args *reset_spec)
++{
++ u32 offset;
++ u8 bit;
++
++ offset = (reset_spec->args[0] << BSP_RESET_OFFSET_SHIFT)
++ & BSP_RESET_OFFSET_MASK;
++ bit = reset_spec->args[1] & BSP_RESET_BIT_MASK;
++
++ return (offset | bit);
++}
++
++static int bsp_reset_assert(struct reset_controller_dev *rcdev,
++ unsigned long id)
++{
++ struct bsp_reset_controller *rstc = container_of(rcdev,
++ struct bsp_reset_controller, rcdev);
++ unsigned long flags;
++ u32 offset, reg;
++ u8 bit;
++
++ offset = (id & BSP_RESET_OFFSET_MASK) >> BSP_RESET_OFFSET_SHIFT;
++ bit = id & BSP_RESET_BIT_MASK;
++
++ spin_lock_irqsave(&rstc->lock, flags);
++
++ reg = readl(rstc->membase + offset);
++ writel(reg | BIT(bit), rstc->membase + offset);
++
++ spin_unlock_irqrestore(&rstc->lock, flags);
++
++ return 0;
++}
++
++static int bsp_reset_deassert(struct reset_controller_dev *rcdev,
++ unsigned long id)
++{
++ struct bsp_reset_controller *rstc = container_of(rcdev,
++ struct bsp_reset_controller, rcdev);
++ unsigned long flags;
++ u32 offset, reg;
++ u8 bit;
++
++ offset = (id & BSP_RESET_OFFSET_MASK) >> BSP_RESET_OFFSET_SHIFT;
++ bit = id & BSP_RESET_BIT_MASK;
++
++ spin_lock_irqsave(&rstc->lock, flags);
++
++ reg = readl(rstc->membase + offset);
++ writel(reg & ~BIT(bit), rstc->membase + offset);
++
++ spin_unlock_irqrestore(&rstc->lock, flags);
++
++ return 0;
++}
++
++static const struct reset_control_ops bsp_reset_ops = {
++ .assert = bsp_reset_assert,
++ .deassert = bsp_reset_deassert,
++};
++
++#ifdef CONFIG_ARCH_BSP
++int __init bsp_reset_init(struct device_node *np,
++ int nr_rsts)
++{
++ struct bsp_reset_controller *rstc;
++
++ rstc = kzalloc(sizeof(*rstc), GFP_KERNEL);
++ if (!rstc)
++ return -ENOMEM;
++
++ rstc->membase = of_iomap(np, 0);
++ if (!rstc->membase){
++ kfree(rstc);
++ return -EINVAL;
++ }
++
++ spin_lock_init(&rstc->lock);
++
++ rstc->rcdev.owner = THIS_MODULE;
++ rstc->rcdev.nr_resets = nr_rsts;
++ rstc->rcdev.ops = &bsp_reset_ops;
++ rstc->rcdev.of_node = np;
++ rstc->rcdev.of_reset_n_cells = 2;
++ rstc->rcdev.of_xlate = bsp_reset_of_xlate;
++
++ return reset_controller_register(&rstc->rcdev);
++}
++EXPORT_SYMBOL_GPL(bsp_reset_init);
++#endif
++
++struct bsp_reset_controller *vendor_reset_init(struct platform_device *pdev)
++{
++ struct bsp_reset_controller *rstc;
++ struct resource *res;
++
++ rstc = devm_kmalloc(&pdev->dev, sizeof(*rstc), GFP_KERNEL);
++ if (!rstc)
++ return NULL;
++
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ rstc->membase = devm_ioremap_resource(&pdev->dev, res);
++ if (IS_ERR(rstc->membase))
++ return NULL;
++
++ spin_lock_init(&rstc->lock);
++ rstc->rcdev.owner = THIS_MODULE;
++ rstc->rcdev.ops = &bsp_reset_ops;
++ rstc->rcdev.of_node = pdev->dev.of_node;
++ rstc->rcdev.of_reset_n_cells = 2; /* 2:used to parse the resets node. */
++ rstc->rcdev.of_xlate = bsp_reset_of_xlate;
++ reset_controller_register(&rstc->rcdev);
++
++ return rstc;
++}
++EXPORT_SYMBOL_GPL(vendor_reset_init);
++
++void bsp_reset_exit(struct bsp_reset_controller *rstc)
++{
++ reset_controller_unregister(&rstc->rcdev);
++}
++EXPORT_SYMBOL_GPL(bsp_reset_exit);
+diff --git a/drivers/clk/vendor/reset.h b/drivers/clk/vendor/reset.h
+new file mode 100644
+index 000000000000..a9535170cedf
+--- /dev/null
++++ b/drivers/clk/vendor/reset.h
+@@ -0,0 +1,29 @@
++/*
++ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2020-2023. All rights reserved.
++ */
++
++#ifndef __BSP_RESET_H
++#define __BSP_RESET_H
++
++#include
++
++struct device_node;
++struct bsp_reset_controller;
++
++#ifdef CONFIG_RESET_CONTROLLER
++struct bsp_reset_controller *vendor_reset_init(struct platform_device *pdev);
++#ifdef CONFIG_ARCH_BSP
++int __init bsp_reset_init(struct device_node *np, int nr_rsts);
++#endif
++void bsp_reset_exit(struct bsp_reset_controller *rstc);
++#else
++static inline
++struct bsp_reset_controller *vendor_reset_init(struct platform_device *pdev)
++{
++ return 0;
++}
++static inline void bsp_reset_exit(struct bsp_reset_controller *rstc)
++{}
++#endif
++
++#endif /* __BSP_RESET_H */
+diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
+index 8928816a4f30..69c7a9e57230 100644
+--- a/drivers/dma/Makefile
++++ b/drivers/dma/Makefile
+@@ -82,6 +82,7 @@ obj-$(CONFIG_XGENE_DMA) += xgene-dma.o
+ obj-$(CONFIG_ZX_DMA) += zx_dma.o
+ obj-$(CONFIG_ST_FDMA) += st_fdma.o
+ obj-$(CONFIG_FSL_DPAA2_QDMA) += fsl-dpaa2-qdma/
++obj-$(CONFIG_EDMACV310) += edmacv310.o
+
+ obj-y += mediatek/
+ obj-y += qcom/
+diff --git a/drivers/dma/edmacv310.c b/drivers/dma/edmacv310.c
+new file mode 100644
+index 000000000000..d3d475e6092d
+--- /dev/null
++++ b/drivers/dma/edmacv310.c
+@@ -0,0 +1,1450 @@
++/*
++ *
++ * Copyright (c) 2015-2021 Shenshu Technologies Co., Ltd.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++#include "edmacv310.h"
++#include "dmaengine.h"
++#include "virt-dma.h"
++#include
++
++#define DRIVER_NAME "edmacv310"
++
++#define MAX_TSFR_LLIS 512
++#define EDMACV300_LLI_WORDS 64
++#define EDMACV300_POOL_ALIGN 64
++#define BITS_PER_HALF_WORD 32
++#define ERR_STATUS_REG_NUM 3
++
++typedef struct edmac_lli {
++ u64 next_lli;
++ u32 reserved[5];
++ u32 count;
++ u64 src_addr;
++ u64 dest_addr;
++ u32 config;
++ u32 pad[3];
++} edmac_lli;
++
++struct edmac_sg {
++ dma_addr_t src_addr;
++ dma_addr_t dst_addr;
++ size_t len;
++ struct list_head node;
++};
++
++struct transfer_desc {
++ struct virt_dma_desc virt_desc;
++ dma_addr_t llis_busaddr;
++ u64 *llis_vaddr;
++ u32 ccfg;
++ size_t size;
++ bool done;
++ bool cyclic;
++};
++
++enum edmac_dma_chan_state {
++ EDMAC_CHAN_IDLE,
++ EDMAC_CHAN_RUNNING,
++ EDMAC_CHAN_PAUSED,
++ EDMAC_CHAN_WAITING,
++};
++
++struct edmacv310_dma_chan {
++ bool slave;
++ int signal;
++ int id;
++ struct virt_dma_chan virt_chan;
++ struct edmacv310_phy_chan *phychan;
++ struct dma_slave_config cfg;
++ struct transfer_desc *at;
++ struct edmacv310_driver_data *host;
++ enum edmac_dma_chan_state state;
++};
++
++struct edmacv310_phy_chan {
++ unsigned int id;
++ void __iomem *base;
++ spinlock_t lock;
++ struct edmacv310_dma_chan *serving;
++};
++
++struct edmacv310_driver_data {
++ struct platform_device *dev;
++ struct dma_device slave;
++ struct dma_device memcpy;
++ void __iomem *base;
++ struct regmap *misc_regmap;
++ void __iomem *crg_ctrl;
++ struct edmacv310_phy_chan *phy_chans;
++ struct dma_pool *pool;
++ unsigned int misc_ctrl_base;
++ int irq;
++ unsigned int id;
++ struct clk *clk;
++ struct clk *axi_clk;
++ struct reset_control *rstc;
++ unsigned int channels;
++ unsigned int slave_requests;
++ unsigned int max_transfer_size;
++};
++
++#ifdef DEBUG_EDMAC
++void dump_lli(const u64 *llis_vaddr, unsigned int num)
++{
++ edmac_lli *plli = (edmac_lli *)llis_vaddr;
++ unsigned int i;
++
++ edmacv310_trace(EDMACV310_CONFIG_TRACE_LEVEL, "lli num = 0%d\n", num);
++ for (i = 0; i < num; i++) {
++ printk("lli%d:lli_L: 0x%llx\n", i, plli[i].next_lli & 0xffffffff);
++ printk("lli%d:lli_H: 0x%llx\n", i, (plli[i].next_lli >> BITS_PER_HALF_WORD) & 0xffffffff);
++ printk("lli%d:count: 0x%x\n", i, plli[i].count);
++ printk("lli%d:src_addr_L: 0x%llx\n", i, plli[i].src_addr & 0xffffffff);
++ printk("lli%d:src_addr_H: 0x%llx\n", i, (plli[i].src_addr >> BITS_PER_HALF_WORD) & 0xffffffff);
++ printk("lli%d:dst_addr_L: 0x%llx\n", i, plli[i].dest_addr & 0xffffffff);
++ printk("lli%d:dst_addr_H: 0x%llx\n", i, (plli[i].dest_addr >> BITS_PER_HALF_WORD) & 0xffffffff);
++ printk("lli%d:CONFIG: 0x%x\n", i, plli[i].config);
++ }
++}
++
++#else
++void dump_lli(const u64 *llis_vaddr, unsigned int num)
++{
++}
++#endif
++
++static inline struct edmacv310_dma_chan *to_edamc_chan(const struct dma_chan *chan)
++{
++ return container_of(chan, struct edmacv310_dma_chan, virt_chan.chan);
++}
++
++static inline struct transfer_desc *to_edmac_transfer_desc(
++ const struct dma_async_tx_descriptor *tx)
++{
++ return container_of(tx, struct transfer_desc, virt_desc.tx);
++}
++
++static struct dma_chan *edmac_find_chan_id(
++ const struct edmacv310_driver_data *edmac,
++ int request_num)
++{
++ struct edmacv310_dma_chan *edmac_dma_chan = NULL;
++
++ list_for_each_entry(edmac_dma_chan, &edmac->slave.channels,
++ virt_chan.chan.device_node) {
++ if (edmac_dma_chan->id == request_num)
++ return &edmac_dma_chan->virt_chan.chan;
++ }
++ return NULL;
++}
++
++static struct dma_chan *edma_of_xlate(struct of_phandle_args *dma_spec,
++ struct of_dma *ofdma)
++{
++ struct edmacv310_driver_data *edmac = ofdma->of_dma_data;
++ struct edmacv310_dma_chan *edmac_dma_chan = NULL;
++ struct dma_chan *dma_chan = NULL;
++ struct regmap *misc = NULL;
++ unsigned int signal, request_num;
++ unsigned int reg = 0;
++ unsigned int offset = 0;
++
++ if (!edmac)
++ return NULL;
++
++ misc = edmac->misc_regmap;
++
++ if (dma_spec->args_count != 2) { /* check num of dts node args */
++ edmacv310_error("args count not true!\n");
++ return NULL;
++ }
++
++ request_num = dma_spec->args[0];
++ signal = dma_spec->args[1];
++
++ edmacv310_trace(EDMACV310_CONFIG_TRACE_LEVEL, "host->id = %d,signal = %d, request_num = %d\n",
++ edmac->id, signal, request_num);
++
++ if (misc != NULL) {
++ offset = edmac->misc_ctrl_base + (request_num & (~0x3));
++ regmap_read(misc, offset, ®);
++ /* set misc for signal line */
++ reg &= ~(0x3f << ((request_num & 0x3) << 3));
++ reg |= signal << ((request_num & 0x3) << 3);
++ regmap_write(misc, offset, reg);
++ }
++
++ edmacv310_trace(EDMACV310_CONFIG_TRACE_LEVEL, "offset = 0x%x, reg = 0x%x\n", offset, reg);
++
++ dma_chan = edmac_find_chan_id(edmac, request_num);
++ if (!dma_chan) {
++ edmacv310_error("DMA slave channel is not found!\n");
++ return NULL;
++ }
++
++ edmac_dma_chan = to_edamc_chan(dma_chan);
++ edmac_dma_chan->signal = request_num;
++ return dma_get_slave_channel(dma_chan);
++}
++
++static int edmacv310_devm_get(struct edmacv310_driver_data *edmac)
++{
++ struct platform_device *platdev = edmac->dev;
++ struct resource *res = NULL;
++
++ edmac->clk = devm_clk_get(&(platdev->dev), "apb_pclk");
++ if (IS_ERR(edmac->clk))
++ return PTR_ERR(edmac->clk);
++
++ edmac->axi_clk = devm_clk_get(&(platdev->dev), "axi_aclk");
++ if (IS_ERR(edmac->axi_clk))
++ return PTR_ERR(edmac->axi_clk);
++
++ edmac->irq = platform_get_irq(platdev, 0);
++ if (unlikely(edmac->irq < 0))
++ return -ENODEV;
++
++ edmac->rstc = devm_reset_control_get(&(platdev->dev), "dma-reset");
++ if (IS_ERR(edmac->rstc))
++ return PTR_ERR(edmac->rstc);
++
++ res = platform_get_resource(platdev, IORESOURCE_MEM, 0);
++ if (!res) {
++ edmacv310_error("no reg resource\n");
++ return -ENODEV;
++ }
++
++ edmac->base = devm_ioremap_resource(&(platdev->dev), res);
++ if (IS_ERR(edmac->base))
++ return PTR_ERR(edmac->base);
++
++ res = platform_get_resource_byname(platdev, IORESOURCE_MEM, "dma_peri_channel_req_sel");
++ if (res) {
++ void *dma_peri_channel_req_sel = ioremap(res->start, res->end - res->start);
++ if (IS_ERR(dma_peri_channel_req_sel))
++ return PTR_ERR(dma_peri_channel_req_sel);
++ writel(0xffffffff, dma_peri_channel_req_sel);
++ iounmap(dma_peri_channel_req_sel);
++ }
++ return 0;
++}
++
++static int edmacv310_of_property_read(struct edmacv310_driver_data *edmac)
++{
++ struct platform_device *platdev = edmac->dev;
++ struct device_node *np = platdev->dev.of_node;
++ int ret;
++
++ if (!of_find_property(np, "misc_regmap", NULL) ||
++ !of_find_property(np, "misc_ctrl_base", NULL)) {
++ edmac->misc_regmap = 0;
++ } else {
++ edmac->misc_regmap = syscon_regmap_lookup_by_phandle(np, "misc_regmap");
++ if (IS_ERR(edmac->misc_regmap))
++ return PTR_ERR(edmac->misc_regmap);
++
++ ret = of_property_read_u32(np, "misc_ctrl_base", &(edmac->misc_ctrl_base));
++ if (ret) {
++ edmacv310_error("get dma-misc_ctrl_base fail\n");
++ return -ENODEV;
++ }
++ }
++ ret = of_property_read_u32(np, "devid", &(edmac->id));
++ if (ret) {
++ edmacv310_error("get edmac id fail\n");
++ return -ENODEV;
++ }
++ ret = of_property_read_u32(np, "dma-channels", &(edmac->channels));
++ if (ret) {
++ edmacv310_error("get dma-channels fail\n");
++ return -ENODEV;
++ }
++ ret = of_property_read_u32(np, "dma-requests", &(edmac->slave_requests));
++ if (ret) {
++ edmacv310_error("get dma-requests fail\n");
++ return -ENODEV;
++ }
++ edmacv310_trace(EDMACV310_REG_TRACE_LEVEL, "dma-channels = %d, dma-requests = %d\n",
++ edmac->channels, edmac->slave_requests);
++ return 0;
++}
++
++static int get_of_probe(struct edmacv310_driver_data *edmac)
++{
++ struct platform_device *platdev = edmac->dev;
++ int ret;
++
++ ret = edmacv310_devm_get(edmac);
++ if (ret)
++ return ret;
++
++ ret = edmacv310_of_property_read(edmac);
++ if (ret)
++ return ret;
++
++ return of_dma_controller_register(platdev->dev.of_node,
++ edma_of_xlate, edmac);
++}
++
++static void edmac_free_chan_resources(struct dma_chan *chan)
++{
++ vchan_free_chan_resources(to_virt_chan(chan));
++}
++
++static size_t read_residue_from_phychan(
++ const struct edmacv310_dma_chan *edmac_dma_chan,
++ const struct transfer_desc *tsf_desc)
++{
++ size_t bytes;
++ u64 next_lli;
++ struct edmacv310_phy_chan *phychan = edmac_dma_chan->phychan;
++ unsigned int i, index;
++ struct edmacv310_driver_data *edmac = edmac_dma_chan->host;
++ edmac_lli *plli = NULL;
++
++ next_lli = (edmacv310_readl(edmac->base + edmac_cx_lli_l(phychan->id)) &
++ (~(EDMAC_LLI_ALIGN - 1)));
++ next_lli |= ((u64)(edmacv310_readl(edmac->base + edmac_cx_lli_h(
++ phychan->id)) & 0xffffffff) << BITS_PER_HALF_WORD);
++ bytes = edmacv310_readl(edmac->base + edmac_cx_curr_cnt0(
++ phychan->id));
++ if (next_lli != 0) {
++ /* It means lli mode */
++ bytes += tsf_desc->size;
++ index = (next_lli - tsf_desc->llis_busaddr) / sizeof(*plli);
++ plli = (edmac_lli *)(tsf_desc->llis_vaddr);
++
++ if (index > MAX_TSFR_LLIS)
++ return 0;
++
++ for (i = 0; i < index; i++)
++ bytes -= plli[i].count;
++ }
++ return bytes;
++}
++
++static enum dma_status edmac_tx_status(struct dma_chan *chan,
++ dma_cookie_t cookie,
++ struct dma_tx_state *txstate)
++{
++ enum dma_status ret;
++ struct edmacv310_dma_chan *edmac_dma_chan = to_edamc_chan(chan);
++ struct virt_dma_desc *vd = NULL;
++ struct transfer_desc *tsf_desc = NULL;
++ unsigned long flags;
++ size_t bytes;
++
++ ret = dma_cookie_status(chan, cookie, txstate);
++ if (ret == DMA_COMPLETE)
++ return ret;
++
++ spin_lock_irqsave(&edmac_dma_chan->virt_chan.lock, flags);
++ vd = vchan_find_desc(&edmac_dma_chan->virt_chan, cookie);
++ if (vd) {
++ /* no been trasfer */
++ tsf_desc = to_edmac_transfer_desc(&vd->tx);
++ bytes = tsf_desc->size;
++ } else {
++ /* trasfering */
++ tsf_desc = edmac_dma_chan->at;
++
++ if (!(edmac_dma_chan->phychan) || !tsf_desc) {
++ spin_unlock_irqrestore(&edmac_dma_chan->virt_chan.lock, flags);
++ return ret;
++ }
++ bytes = read_residue_from_phychan(edmac_dma_chan, tsf_desc);
++ }
++ spin_unlock_irqrestore(&edmac_dma_chan->virt_chan.lock, flags);
++ dma_set_residue(txstate, bytes);
++
++ if (edmac_dma_chan->state == EDMAC_CHAN_PAUSED && ret == DMA_IN_PROGRESS)
++ return DMA_PAUSED;
++
++ return ret;
++}
++
++static struct edmacv310_phy_chan *edmac_get_phy_channel(
++ const struct edmacv310_driver_data *edmac,
++ struct edmacv310_dma_chan *edmac_dma_chan)
++{
++ struct edmacv310_phy_chan *ch = NULL;
++ unsigned long flags;
++ int i;
++
++ for (i = 0; i < edmac->channels; i++) {
++ ch = &edmac->phy_chans[i];
++
++ spin_lock_irqsave(&ch->lock, flags);
++
++ if (!ch->serving) {
++ ch->serving = edmac_dma_chan;
++ spin_unlock_irqrestore(&ch->lock, flags);
++ break;
++ }
++ spin_unlock_irqrestore(&ch->lock, flags);
++ }
++
++ if (i == edmac->channels)
++ return NULL;
++
++ return ch;
++}
++
++static void edmac_write_lli(const struct edmacv310_driver_data *edmac,
++ const struct edmacv310_phy_chan *phychan,
++ const struct transfer_desc *tsf_desc)
++{
++ edmac_lli *plli = (edmac_lli *)tsf_desc->llis_vaddr;
++
++ if (plli->next_lli != 0x0)
++ edmacv310_writel((plli->next_lli & 0xffffffff) | EDMAC_LLI_ENABLE,
++ edmac->base + edmac_cx_lli_l(phychan->id));
++ else
++ edmacv310_writel((plli->next_lli & 0xffffffff),
++ edmac->base + edmac_cx_lli_l(phychan->id));
++
++ edmacv310_writel(((plli->next_lli >> 32) & 0xffffffff),
++ edmac->base + edmac_cx_lli_h(phychan->id));
++ edmacv310_writel(plli->count, edmac->base + edmac_cx_cnt0(phychan->id));
++ edmacv310_writel(plli->src_addr & 0xffffffff,
++ edmac->base + edmac_cx_src_addr_l(phychan->id));
++ edmacv310_writel((plli->src_addr >> 32) & 0xffffffff,
++ edmac->base + edmac_cx_src_addr_h(phychan->id));
++ edmacv310_writel(plli->dest_addr & 0xffffffff,
++ edmac->base + edmac_cx_dest_addr_l(phychan->id));
++ edmacv310_writel((plli->dest_addr >> 32) & 0xffffffff,
++ edmac->base + edmac_cx_dest_addr_h(phychan->id));
++ edmacv310_writel(plli->config,
++ edmac->base + edmac_cx_config(phychan->id));
++}
++
++static void edmac_start_next_txd(struct edmacv310_dma_chan *edmac_dma_chan)
++{
++ struct edmacv310_driver_data *edmac = edmac_dma_chan->host;
++ struct edmacv310_phy_chan *phychan = edmac_dma_chan->phychan;
++ struct virt_dma_desc *vd = vchan_next_desc(&edmac_dma_chan->virt_chan);
++ struct transfer_desc *tsf_desc = to_edmac_transfer_desc(&vd->tx);
++ unsigned int val;
++ list_del(&tsf_desc->virt_desc.node);
++ edmac_dma_chan->at = tsf_desc;
++ edmac_write_lli(edmac, phychan, tsf_desc);
++ val = edmacv310_readl(edmac->base + edmac_cx_config(phychan->id));
++ edmacv310_trace(EDMACV310_REG_TRACE_LEVEL, " EDMAC_Cx_CONFIG = 0x%x\n", val);
++ edmacv310_writel(val | EDMAC_CXCONFIG_LLI_START,
++ edmac->base + edmac_cx_config(phychan->id));
++}
++
++static void edmac_start(struct edmacv310_dma_chan *edmac_dma_chan)
++{
++ struct edmacv310_driver_data *edmac = edmac_dma_chan->host;
++ struct edmacv310_phy_chan *ch;
++ ch = edmac_get_phy_channel(edmac, edmac_dma_chan);
++ if (!ch) {
++ edmacv310_error("no phy channel available !\n");
++ edmac_dma_chan->state = EDMAC_CHAN_WAITING;
++ return;
++ }
++ edmac_dma_chan->phychan = ch;
++ edmac_dma_chan->state = EDMAC_CHAN_RUNNING;
++ edmac_start_next_txd(edmac_dma_chan);
++}
++
++static void edmac_issue_pending(struct dma_chan *chan)
++{
++ struct edmacv310_dma_chan *edmac_dma_chan = to_edamc_chan(chan);
++ unsigned long flags;
++ spin_lock_irqsave(&edmac_dma_chan->virt_chan.lock, flags);
++ if (vchan_issue_pending(&edmac_dma_chan->virt_chan)) {
++ if (!edmac_dma_chan->phychan && edmac_dma_chan->state != EDMAC_CHAN_WAITING)
++ edmac_start(edmac_dma_chan);
++ }
++ spin_unlock_irqrestore(&edmac_dma_chan->virt_chan.lock, flags);
++}
++
++static void edmac_free_txd_list(struct edmacv310_dma_chan *edmac_dma_chan)
++{
++ LIST_HEAD(head);
++ vchan_get_all_descriptors(&edmac_dma_chan->virt_chan, &head);
++ vchan_dma_desc_free_list(&edmac_dma_chan->virt_chan, &head);
++}
++
++static int edmac_config(struct dma_chan *chan,
++ struct dma_slave_config *config)
++{
++ struct edmacv310_dma_chan *edmac_dma_chan = to_edamc_chan(chan);
++ if (!edmac_dma_chan->slave) {
++ edmacv310_error("slave is null!");
++ return -EINVAL;
++ }
++ edmac_dma_chan->cfg = *config;
++ return 0;
++}
++
++static void edmac_pause_phy_chan(const struct edmacv310_dma_chan *edmac_dma_chan)
++{
++ struct edmacv310_driver_data *edmac = edmac_dma_chan->host;
++ struct edmacv310_phy_chan *phychan = edmac_dma_chan->phychan;
++ unsigned int val;
++ int timeout;
++
++ val = edmacv310_readl(edmac->base + edmac_cx_config(phychan->id));
++ val &= ~CCFG_EN;
++ edmacv310_writel(val, edmac->base + edmac_cx_config(phychan->id));
++ /* Wait for channel inactive */
++ for (timeout = 2000; timeout > 0; timeout--) {
++ if (!((0x1 << phychan->id) & edmacv310_readl(edmac->base + EDMAC_CH_STAT)))
++ break;
++ edmacv310_writel(val, edmac->base + edmac_cx_config(phychan->id));
++ udelay(1);
++ }
++ if (timeout == 0)
++ edmacv310_error(":channel%u timeout waiting for pause, timeout:%d\n",
++ phychan->id, timeout);
++}
++
++static int edmac_pause(struct dma_chan *chan)
++{
++ struct edmacv310_dma_chan *edmac_dma_chan = to_edamc_chan(chan);
++ unsigned long flags;
++
++ spin_lock_irqsave(&edmac_dma_chan->virt_chan.lock, flags);
++ if (!edmac_dma_chan->phychan) {
++ spin_unlock_irqrestore(&edmac_dma_chan->virt_chan.lock, flags);
++ return 0;
++ }
++ edmac_pause_phy_chan(edmac_dma_chan);
++ edmac_dma_chan->state = EDMAC_CHAN_PAUSED;
++ spin_unlock_irqrestore(&edmac_dma_chan->virt_chan.lock, flags);
++ return 0;
++}
++
++static void edmac_resume_phy_chan(const struct edmacv310_dma_chan *edmac_dma_chan)
++{
++ struct edmacv310_driver_data *edmac = edmac_dma_chan->host;
++ struct edmacv310_phy_chan *phychan = edmac_dma_chan->phychan;
++ unsigned int val;
++ val = edmacv310_readl(edmac->base + edmac_cx_config(phychan->id));
++ val |= CCFG_EN;
++ edmacv310_writel(val, edmac->base + edmac_cx_config(phychan->id));
++}
++
++static int edmac_resume(struct dma_chan *chan)
++{
++ struct edmacv310_dma_chan *edmac_dma_chan = to_edamc_chan(chan);
++ unsigned long flags;
++
++ spin_lock_irqsave(&edmac_dma_chan->virt_chan.lock, flags);
++
++ if (!edmac_dma_chan->phychan) {
++ spin_unlock_irqrestore(&edmac_dma_chan->virt_chan.lock, flags);
++ return 0;
++ }
++
++ edmac_resume_phy_chan(edmac_dma_chan);
++ edmac_dma_chan->state = EDMAC_CHAN_RUNNING;
++ spin_unlock_irqrestore(&edmac_dma_chan->virt_chan.lock, flags);
++
++ return 0;
++}
++
++void edmac_phy_free(struct edmacv310_dma_chan *chan);
++static void edmac_desc_free(struct virt_dma_desc *vd);
++static int edmac_terminate_all(struct dma_chan *chan)
++{
++ struct edmacv310_dma_chan *edmac_dma_chan = to_edamc_chan(chan);
++ unsigned long flags;
++
++ spin_lock_irqsave(&edmac_dma_chan->virt_chan.lock, flags);
++ if (!edmac_dma_chan->phychan && !edmac_dma_chan->at) {
++ spin_unlock_irqrestore(&edmac_dma_chan->virt_chan.lock, flags);
++ return 0;
++ }
++
++ edmac_dma_chan->state = EDMAC_CHAN_IDLE;
++
++ if (edmac_dma_chan->phychan)
++ edmac_phy_free(edmac_dma_chan);
++ if (edmac_dma_chan->at) {
++ edmac_desc_free(&edmac_dma_chan->at->virt_desc);
++ edmac_dma_chan->at = NULL;
++ }
++ edmac_free_txd_list(edmac_dma_chan);
++ spin_unlock_irqrestore(&edmac_dma_chan->virt_chan.lock, flags);
++
++ return 0;
++}
++
++static u32 get_width(enum dma_slave_buswidth width)
++{
++ switch (width) {
++ case DMA_SLAVE_BUSWIDTH_1_BYTE:
++ return EDMAC_WIDTH_8BIT;
++ case DMA_SLAVE_BUSWIDTH_2_BYTES:
++ return EDMAC_WIDTH_16BIT;
++ case DMA_SLAVE_BUSWIDTH_4_BYTES:
++ return EDMAC_WIDTH_32BIT;
++ case DMA_SLAVE_BUSWIDTH_8_BYTES:
++ return EDMAC_WIDTH_64BIT;
++ default:
++ edmacv310_error("check here, width warning!\n");
++ return ~0;
++ }
++}
++
++static unsigned int edmac_set_config_value(enum dma_transfer_direction direction,
++ unsigned int addr_width,
++ unsigned int burst,
++ unsigned int signal)
++{
++ unsigned int config, width;
++
++ if (direction == DMA_MEM_TO_DEV)
++ config = EDMAC_CONFIG_SRC_INC;
++ else
++ config = EDMAC_CONFIG_DST_INC;
++
++ edmacv310_trace(EDMACV310_CONFIG_TRACE_LEVEL, "addr_width = 0x%x\n", addr_width);
++ width = get_width(addr_width);
++ edmacv310_trace(EDMACV310_CONFIG_TRACE_LEVEL, "width = 0x%x\n", width);
++ config |= width << EDMAC_CONFIG_SRC_WIDTH_SHIFT;
++ config |= width << EDMAC_CONFIG_DST_WIDTH_SHIFT;
++ edmacv310_trace(EDMACV310_REG_TRACE_LEVEL, "tsf_desc->ccfg = 0x%x\n", config);
++ edmacv310_trace(EDMACV310_CONFIG_TRACE_LEVEL, "burst = 0x%x\n", burst);
++ config |= burst << EDMAC_CONFIG_SRC_BURST_SHIFT;
++ config |= burst << EDMAC_CONFIG_DST_BURST_SHIFT;
++ if (signal >= 0) {
++ edmacv310_trace(EDMACV310_REG_TRACE_LEVEL, "edmac_dma_chan->signal = %d\n", signal);
++ config |= (unsigned int)signal << EDMAC_CXCONFIG_SIGNAL_SHIFT;
++ }
++ config |= EDMAC_CXCONFIG_DEV_MEM_TYPE << EDMAC_CXCONFIG_TSF_TYPE_SHIFT;
++ return config;
++}
++
++struct transfer_desc *edmac_init_tsf_desc(const struct dma_chan *chan,
++ enum dma_transfer_direction direction,
++ dma_addr_t *slave_addr)
++{
++ struct edmacv310_dma_chan *edmac_dma_chan = to_edamc_chan(chan);
++ struct transfer_desc *tsf_desc;
++ unsigned int burst = 0;
++ unsigned int addr_width = 0;
++ unsigned int maxburst = 0;
++ tsf_desc = kzalloc(sizeof(*tsf_desc), GFP_NOWAIT);
++ if (!tsf_desc)
++ return NULL;
++ if (direction == DMA_MEM_TO_DEV) {
++ *slave_addr = edmac_dma_chan->cfg.dst_addr;
++ addr_width = edmac_dma_chan->cfg.dst_addr_width;
++ maxburst = edmac_dma_chan->cfg.dst_maxburst;
++ } else if (direction == DMA_DEV_TO_MEM) {
++ *slave_addr = edmac_dma_chan->cfg.src_addr;
++ addr_width = edmac_dma_chan->cfg.src_addr_width;
++ maxburst = edmac_dma_chan->cfg.src_maxburst;
++ } else {
++ kfree(tsf_desc);
++ edmacv310_error("direction unsupported!\n");
++ return NULL;
++ }
++
++ if (maxburst > (EDMAC_MAX_BURST_WIDTH))
++ burst |= (EDMAC_MAX_BURST_WIDTH - 1);
++ else if (maxburst == 0)
++ burst |= EDMAC_MIN_BURST_WIDTH;
++ else
++ burst |= (maxburst - 1);
++
++ tsf_desc->ccfg = edmac_set_config_value(direction, addr_width,
++ burst, edmac_dma_chan->signal);
++ edmacv310_trace(EDMACV310_REG_TRACE_LEVEL, "tsf_desc->ccfg = 0x%x\n", tsf_desc->ccfg);
++ return tsf_desc;
++}
++
++static int edmac_fill_desc(const struct edmac_sg *dsg,
++ struct transfer_desc *tsf_desc,
++ unsigned int length, unsigned int num)
++{
++ edmac_lli *plli = NULL;
++
++ if (num >= MAX_TSFR_LLIS) {
++ edmacv310_error("lli out of range. \n");
++ return -ENOMEM;
++ }
++
++ plli = (edmac_lli *)(tsf_desc->llis_vaddr);
++ (void)memset_s(&plli[num], sizeof(edmac_lli), 0x0, sizeof(*plli));
++
++ plli[num].src_addr = dsg->src_addr;
++ plli[num].dest_addr = dsg->dst_addr;
++ plli[num].config = tsf_desc->ccfg;
++ plli[num].count = length;
++ tsf_desc->size += length;
++
++ if (num > 0) {
++ plli[num - 1].next_lli = (tsf_desc->llis_busaddr + (num) * sizeof(
++ *plli)) & (~(EDMAC_LLI_ALIGN - 1));
++ plli[num - 1].next_lli |= EDMAC_LLI_ENABLE;
++ }
++ return 0;
++}
++
++static void free_dsg(struct list_head *dsg_head)
++{
++ struct edmac_sg *dsg = NULL;
++ struct edmac_sg *_dsg = NULL;
++
++ list_for_each_entry_safe(dsg, _dsg, dsg_head, node) {
++ list_del(&dsg->node);
++ kfree(dsg);
++ }
++}
++
++static int edmac_add_sg(struct list_head *sg_head,
++ dma_addr_t dst, dma_addr_t src,
++ size_t len)
++{
++ struct edmac_sg *dsg = NULL;
++
++ if (len == 0) {
++ free_dsg(sg_head);
++ edmacv310_error("Transfer length is 0. \n");
++ return -ENOMEM;
++ }
++
++ dsg = (struct edmac_sg *)kzalloc(sizeof(*dsg), GFP_NOWAIT);
++ if (!dsg) {
++ free_dsg(sg_head);
++ edmacv310_error("alloc memory for dsg fail.\n");
++ return -ENOMEM;
++ }
++
++ list_add_tail(&dsg->node, sg_head);
++ dsg->src_addr = src;
++ dsg->dst_addr = dst;
++ dsg->len = len;
++ return 0;
++}
++
++static int edmac_add_sg_slave(struct list_head *sg_head,
++ dma_addr_t slave_addr, dma_addr_t addr,
++ size_t length,
++ enum dma_transfer_direction direction)
++{
++ dma_addr_t src = 0;
++ dma_addr_t dst = 0;
++ if (direction == DMA_MEM_TO_DEV) {
++ src = addr;
++ dst = slave_addr;
++ } else if (direction == DMA_DEV_TO_MEM) {
++ src = slave_addr;
++ dst = addr;
++ } else {
++ edmacv310_error("invali dma_transfer_direction.\n");
++ return -ENOMEM;
++ }
++ return edmac_add_sg(sg_head, dst, src, length);
++}
++
++static int edmac_fill_sg_for_slave(struct list_head *sg_head,
++ dma_addr_t slave_addr,
++ struct scatterlist *sgl,
++ unsigned int sg_len,
++ enum dma_transfer_direction direction)
++{
++ struct scatterlist *sg = NULL;
++ int tmp, ret;
++ size_t length;
++ dma_addr_t addr;
++ if (sgl == NULL) {
++ edmacv310_error("sgl is null!\n");
++ return -ENOMEM;
++ }
++
++ for_each_sg(sgl, sg, sg_len, tmp) {
++ addr = sg_dma_address(sg);
++ length = sg_dma_len(sg);
++ ret = edmac_add_sg_slave(sg_head, slave_addr, addr, length, direction);
++ if (ret)
++ break;
++ }
++ return ret;
++}
++
++static inline int edmac_fill_sg_for_m2m_copy(struct list_head *sg_head,
++ dma_addr_t dst, dma_addr_t src,
++ size_t len)
++{
++ return edmac_add_sg(sg_head, dst, src, len);
++}
++
++struct edmac_cyclic_args {
++ dma_addr_t slave_addr;
++ dma_addr_t buf_addr;
++ size_t buf_len;
++ size_t period_len;
++ enum dma_transfer_direction direction;
++};
++
++static int edmac_fill_sg_for_cyclic(struct list_head *sg_head,
++ struct edmac_cyclic_args args)
++{
++ size_t count_in_sg = 0;
++ size_t trans_bytes;
++ int ret;
++ while (count_in_sg < args.buf_len) {
++ trans_bytes = min(args.period_len, args.buf_len - count_in_sg);
++ count_in_sg += trans_bytes;
++ ret = edmac_add_sg_slave(sg_head, args.slave_addr, args.buf_addr + count_in_sg, count_in_sg, args.direction);
++ if (ret)
++ return ret;
++ }
++ return 0;
++}
++
++static unsigned short get_max_width(dma_addr_t ccfg)
++{
++ unsigned short src_width = (ccfg & EDMAC_CONTROL_SRC_WIDTH_MASK) >>
++ EDMAC_CONFIG_SRC_WIDTH_SHIFT;
++ unsigned short dst_width = (ccfg & EDMAC_CONTROL_DST_WIDTH_MASK) >>
++ EDMAC_CONFIG_DST_WIDTH_SHIFT;
++ return 1 << max(src_width, dst_width); /* to byte */
++}
++
++static int edmac_fill_asg_lli_for_desc(struct edmac_sg *dsg,
++ struct transfer_desc *tsf_desc,
++ unsigned int *lli_count)
++{
++ int ret;
++ unsigned short width = get_max_width(tsf_desc->ccfg);
++
++ while (dsg->len != 0) {
++ size_t lli_len = MAX_TRANSFER_BYTES;
++ lli_len = (lli_len / width) * width; /* bus width align */
++ lli_len = min(lli_len, dsg->len);
++ ret = edmac_fill_desc(dsg, tsf_desc, lli_len, *lli_count);
++ if (ret)
++ return ret;
++
++ if (tsf_desc->ccfg & EDMAC_CONFIG_SRC_INC)
++ dsg->src_addr += lli_len;
++ if (tsf_desc->ccfg & EDMAC_CONFIG_DST_INC)
++ dsg->dst_addr += lli_len;
++ dsg->len -= lli_len;
++ (*lli_count)++;
++ }
++ return 0;
++}
++
++static int edmac_fill_lli_for_desc(const struct list_head *sg_head,
++ struct transfer_desc *tsf_desc)
++{
++ struct edmac_sg *dsg = NULL;
++ struct edmac_lli *last_plli = NULL;
++ unsigned int lli_count = 0;
++ int ret;
++
++ list_for_each_entry(dsg, sg_head, node) {
++ ret = edmac_fill_asg_lli_for_desc(dsg, tsf_desc, &lli_count);
++ if (ret)
++ return ret;
++ }
++
++ if (tsf_desc->cyclic) {
++ last_plli = (edmac_lli *)((uintptr_t)tsf_desc->llis_vaddr +
++ (lli_count - 1) * sizeof(*last_plli));
++ last_plli->next_lli = tsf_desc->llis_busaddr | EDMAC_LLI_ENABLE;
++ } else {
++ last_plli = (edmac_lli *)((uintptr_t)tsf_desc->llis_vaddr +
++ (lli_count - 1) * sizeof(*last_plli));
++ last_plli->next_lli = 0;
++ }
++ dump_lli(tsf_desc->llis_vaddr, lli_count);
++ return 0;
++}
++
++static struct dma_async_tx_descriptor *edmac_prep_slave_sg(
++ struct dma_chan *chan, struct scatterlist *sgl,
++ unsigned int sg_len, enum dma_transfer_direction direction,
++ unsigned long flags, void *context)
++{
++ struct edmacv310_dma_chan *edmac_dma_chan = to_edamc_chan(chan);
++ struct edmacv310_driver_data *edmac = edmac_dma_chan->host;
++ struct transfer_desc *tsf_desc = NULL;
++ dma_addr_t slave_addr = 0;
++ int ret;
++ LIST_HEAD(sg_head);
++ if (sgl == NULL) {
++ edmacv310_error("sgl is null!\n");
++ return NULL;
++ }
++
++ tsf_desc = edmac_init_tsf_desc(chan, direction, &slave_addr);
++ if (!tsf_desc)
++ return NULL;
++
++ tsf_desc->llis_vaddr = dma_pool_alloc(edmac->pool, GFP_NOWAIT,
++ &tsf_desc->llis_busaddr);
++ if (!tsf_desc->llis_vaddr) {
++ edmacv310_error("malloc memory from pool fail !\n");
++ goto err_alloc_lli;
++ }
++
++ ret = edmac_fill_sg_for_slave(&sg_head, slave_addr, sgl, sg_len, direction);
++ if (ret)
++ goto err_fill_sg;
++ ret = edmac_fill_lli_for_desc(&sg_head, tsf_desc);
++ free_dsg(&sg_head);
++ if (ret)
++ goto err_fill_sg;
++ return vchan_tx_prep(&edmac_dma_chan->virt_chan, &tsf_desc->virt_desc, flags);
++
++err_fill_sg:
++ dma_pool_free(edmac->pool, tsf_desc->llis_vaddr, tsf_desc->llis_busaddr);
++err_alloc_lli:
++ kfree(tsf_desc);
++ return NULL;
++}
++
++static struct dma_async_tx_descriptor *edmac_prep_dma_m2m_copy(
++ struct dma_chan *chan, dma_addr_t dst, dma_addr_t src,
++ size_t len, unsigned long flags)
++{
++ struct edmacv310_dma_chan *edmac_dma_chan = to_edamc_chan(chan);
++ struct edmacv310_driver_data *edmac = edmac_dma_chan->host;
++ struct transfer_desc *tsf_desc = NULL;
++ LIST_HEAD(sg_head);
++ u32 config = 0;
++ int ret;
++
++ if (!len)
++ return NULL;
++
++ tsf_desc = kzalloc(sizeof(*tsf_desc), GFP_NOWAIT);
++ if (tsf_desc == NULL) {
++ edmacv310_error("get tsf desc fail!\n");
++ return NULL;
++ }
++
++ tsf_desc->llis_vaddr = dma_pool_alloc(edmac->pool, GFP_NOWAIT,
++ &tsf_desc->llis_busaddr);
++ if (!tsf_desc->llis_vaddr) {
++ edmacv310_error("malloc memory from pool fail !\n");
++ goto err_alloc_lli;
++ }
++
++ config |= EDMAC_CONFIG_SRC_INC | EDMAC_CONFIG_DST_INC;
++ config |= EDMAC_CXCONFIG_MEM_TYPE << EDMAC_CXCONFIG_TSF_TYPE_SHIFT;
++ /* max burst width is 16 ,but reg value set 0xf */
++ config |= (EDMAC_MAX_BURST_WIDTH - 1) << EDMAC_CONFIG_SRC_BURST_SHIFT;
++ config |= (EDMAC_MAX_BURST_WIDTH - 1) << EDMAC_CONFIG_DST_BURST_SHIFT;
++ config |= EDMAC_MEM_BIT_WIDTH << EDMAC_CONFIG_SRC_WIDTH_SHIFT;
++ config |= EDMAC_MEM_BIT_WIDTH << EDMAC_CONFIG_DST_WIDTH_SHIFT;
++ tsf_desc->ccfg = config;
++ ret = edmac_fill_sg_for_m2m_copy(&sg_head, dst, src, len);
++ if (ret)
++ goto err_fill_sg;
++ ret = edmac_fill_lli_for_desc(&sg_head, tsf_desc);
++ free_dsg(&sg_head);
++ if (ret)
++ goto err_fill_sg;
++ return vchan_tx_prep(&edmac_dma_chan->virt_chan, &tsf_desc->virt_desc, flags);
++
++err_fill_sg:
++ dma_pool_free(edmac->pool, tsf_desc->llis_vaddr, tsf_desc->llis_busaddr);
++err_alloc_lli:
++ kfree(tsf_desc);
++ return NULL;
++}
++
++static struct dma_async_tx_descriptor *edmac_prep_dma_cyclic(
++ struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
++ size_t period_len, enum dma_transfer_direction direction,
++ unsigned long flags)
++{
++ struct edmacv310_dma_chan *edmac_dma_chan = to_edamc_chan(chan);
++ struct edmacv310_driver_data *edmac = edmac_dma_chan->host;
++ struct transfer_desc *tsf_desc = NULL;
++ struct edmac_cyclic_args args = {
++ .slave_addr = 0,
++ .buf_addr = buf_addr,
++ .buf_len = buf_len,
++ .period_len = period_len,
++ .direction = direction
++ };
++ LIST_HEAD(sg_head);
++ int ret;
++
++ tsf_desc = edmac_init_tsf_desc(chan, direction, &(args.slave_addr));
++ if (!tsf_desc)
++ return NULL;
++
++ tsf_desc->llis_vaddr = dma_pool_alloc(edmac->pool, GFP_NOWAIT,
++ &tsf_desc->llis_busaddr);
++ if (!tsf_desc->llis_vaddr) {
++ edmacv310_error("malloc memory from pool fail !\n");
++ goto err_alloc_lli;
++ }
++
++ tsf_desc->cyclic = true;
++ ret = edmac_fill_sg_for_cyclic(&sg_head, args);
++ if (ret)
++ goto err_fill_sg;
++ ret = edmac_fill_lli_for_desc(&sg_head, tsf_desc);
++ free_dsg(&sg_head);
++ if (ret)
++ goto err_fill_sg;
++ return vchan_tx_prep(&edmac_dma_chan->virt_chan, &tsf_desc->virt_desc, flags);
++
++err_fill_sg:
++ dma_pool_free(edmac->pool, tsf_desc->llis_vaddr, tsf_desc->llis_busaddr);
++err_alloc_lli:
++ kfree(tsf_desc);
++ return NULL;
++}
++
++static void edmac_phy_reassign(struct edmacv310_phy_chan *phy_chan,
++ struct edmacv310_dma_chan *chan)
++{
++ phy_chan->serving = chan;
++ chan->phychan = phy_chan;
++ chan->state = EDMAC_CHAN_RUNNING;
++
++ edmac_start_next_txd(chan);
++}
++
++static void edmac_terminate_phy_chan(const struct edmacv310_driver_data *edmac,
++ const struct edmacv310_dma_chan *edmac_dma_chan)
++{
++ unsigned int val;
++ struct edmacv310_phy_chan *phychan = edmac_dma_chan->phychan;
++ edmac_pause_phy_chan(edmac_dma_chan);
++ val = 0x1 << phychan->id;
++ edmacv310_writel(val, edmac->base + EDMAC_INT_TC1_RAW);
++ edmacv310_writel(val, edmac->base + EDMAC_INT_ERR1_RAW);
++ edmacv310_writel(val, edmac->base + EDMAC_INT_ERR2_RAW);
++}
++
++void edmac_phy_free(struct edmacv310_dma_chan *chan)
++{
++ struct edmacv310_driver_data *edmac = chan->host;
++ struct edmacv310_dma_chan *p = NULL;
++ struct edmacv310_dma_chan *next = NULL;
++
++ list_for_each_entry(p, &edmac->memcpy.channels, virt_chan.chan.device_node) {
++ if (p->state == EDMAC_CHAN_WAITING) {
++ next = p;
++ break;
++ }
++ }
++
++ if (!next) {
++ list_for_each_entry(p, &edmac->slave.channels, virt_chan.chan.device_node) {
++ if (p->state == EDMAC_CHAN_WAITING) {
++ next = p;
++ break;
++ }
++ }
++ }
++ edmac_terminate_phy_chan(edmac, chan);
++
++ if (next) {
++ spin_lock(&next->virt_chan.lock);
++ edmac_phy_reassign(chan->phychan, next);
++ spin_unlock(&next->virt_chan.lock);
++ } else {
++ chan->phychan->serving = NULL;
++ }
++
++ chan->phychan = NULL;
++ chan->state = EDMAC_CHAN_IDLE;
++}
++
++bool handle_irq(const struct edmacv310_driver_data *edmac, int chan_id)
++{
++ struct edmacv310_dma_chan *chan = NULL;
++ struct edmacv310_phy_chan *phy_chan = NULL;
++ struct transfer_desc *tsf_desc = NULL;
++ unsigned int channel_tc_status, channel_err_status[ERR_STATUS_REG_NUM];
++
++ phy_chan = &edmac->phy_chans[chan_id];
++ chan = phy_chan->serving;
++ if (!chan) {
++ edmacv310_error("error interrupt on chan: %d!\n", chan_id);
++ return 0;
++ }
++ tsf_desc = chan->at;
++
++ channel_tc_status = edmacv310_readl(edmac->base + EDMAC_INT_TC1_RAW);
++ channel_tc_status = (channel_tc_status >> chan_id) & 0x01;
++ if (channel_tc_status)
++ edmacv310_writel(channel_tc_status << chan_id, edmac->base + EDMAC_INT_TC1_RAW);
++
++ channel_tc_status = edmacv310_readl(edmac->base + EDMAC_INT_TC2);
++ channel_tc_status = (channel_tc_status >> chan_id) & 0x01;
++ if (channel_tc_status)
++ edmacv310_writel(channel_tc_status << chan_id, edmac->base + EDMAC_INT_TC2_RAW);
++
++ channel_err_status[0] = edmacv310_readl(edmac->base + EDMAC_INT_ERR1);
++ channel_err_status[1] = edmacv310_readl(edmac->base + EDMAC_INT_ERR2);
++ channel_err_status[2] = edmacv310_readl(edmac->base + EDMAC_INT_ERR3);
++ if ((channel_err_status[0] | channel_err_status[1] | channel_err_status[2]) & (1 << chan_id)) {
++ edmacv310_error("Error in edmac %d!,ERR1 = 0x%x,ERR2 = 0x%x,ERR3 = 0x%x\n",
++ chan_id, channel_err_status[0],
++ channel_err_status[1], channel_err_status[2]);
++ edmacv310_writel(1 << chan_id, edmac->base + EDMAC_INT_ERR1_RAW);
++ edmacv310_writel(1 << chan_id, edmac->base + EDMAC_INT_ERR2_RAW);
++ edmacv310_writel(1 << chan_id, edmac->base + EDMAC_INT_ERR3_RAW);
++ }
++
++ spin_lock(&chan->virt_chan.lock);
++
++ if (tsf_desc->cyclic) {
++ vchan_cyclic_callback(&tsf_desc->virt_desc);
++ spin_unlock(&chan->virt_chan.lock);
++ return 1;
++ }
++ chan->at = NULL;
++ tsf_desc->done = true;
++ vchan_cookie_complete(&tsf_desc->virt_desc);
++
++ if (vchan_next_desc(&chan->virt_chan))
++ edmac_start_next_txd(chan);
++ else
++ edmac_phy_free(chan);
++ spin_unlock(&chan->virt_chan.lock);
++ return 1;
++}
++
++static irqreturn_t emdacv310_irq(int irq, void *dev)
++{
++ struct edmacv310_driver_data *edmac = (struct edmacv310_driver_data *)dev;
++ u32 mask = 0;
++ unsigned int channel_status, temp, i;
++
++ channel_status = edmacv310_readl(edmac->base + EDMAC_INT_STAT);
++ if (!channel_status) {
++ edmacv310_error("channel_status = 0x%x\n", channel_status);
++ return IRQ_NONE;
++ }
++
++ for (i = 0; i < edmac->channels; i++) {
++ temp = (channel_status >> i) & 0x1;
++ if (temp)
++ mask |= handle_irq(edmac, i) << i;
++ }
++ return mask ? IRQ_HANDLED : IRQ_NONE;
++}
++
++static inline void edmac_dma_slave_init(struct edmacv310_dma_chan *chan)
++{
++ chan->slave = true;
++}
++
++static void edmac_desc_free(struct virt_dma_desc *vd)
++{
++ struct transfer_desc *tsf_desc = to_edmac_transfer_desc(&vd->tx);
++ struct edmacv310_dma_chan *edmac_dma_chan = to_edamc_chan(vd->tx.chan);
++ dma_descriptor_unmap(&vd->tx);
++ dma_pool_free(edmac_dma_chan->host->pool, tsf_desc->llis_vaddr, tsf_desc->llis_busaddr);
++ kfree(tsf_desc);
++}
++
++static int edmac_init_virt_channels(struct edmacv310_driver_data *edmac,
++ struct dma_device *dmadev,
++ unsigned int channels, bool slave)
++{
++ struct edmacv310_dma_chan *chan = NULL;
++ int i;
++ INIT_LIST_HEAD(&dmadev->channels);
++
++ for (i = 0; i < channels; i++) {
++ chan = kzalloc(sizeof(struct edmacv310_dma_chan), GFP_KERNEL);
++ if (!chan) {
++ edmacv310_error("fail to allocate memory for virt channels!");
++ return -1;
++ }
++
++ chan->host = edmac;
++ chan->state = EDMAC_CHAN_IDLE;
++ chan->signal = -1;
++
++ if (slave) {
++ chan->id = i;
++ edmac_dma_slave_init(chan);
++ }
++ chan->virt_chan.desc_free = edmac_desc_free;
++ vchan_init(&chan->virt_chan, dmadev);
++ }
++ return 0;
++}
++
++void edmac_free_virt_channels(struct dma_device *dmadev)
++{
++ struct edmacv310_dma_chan *chan = NULL;
++ struct edmacv310_dma_chan *next = NULL;
++
++ list_for_each_entry_safe(chan, next, &dmadev->channels, virt_chan.chan.device_node) {
++ list_del(&chan->virt_chan.chan.device_node);
++ kfree(chan);
++ }
++}
++
++static void edmacv310_prep_dma_device(struct platform_device *pdev,
++ struct edmacv310_driver_data *edmac)
++{
++ dma_cap_set(DMA_MEMCPY, edmac->memcpy.cap_mask);
++ edmac->memcpy.dev = &pdev->dev;
++ edmac->memcpy.device_free_chan_resources = edmac_free_chan_resources;
++ edmac->memcpy.device_prep_dma_memcpy = edmac_prep_dma_m2m_copy;
++ edmac->memcpy.device_tx_status = edmac_tx_status;
++ edmac->memcpy.device_issue_pending = edmac_issue_pending;
++ edmac->memcpy.device_config = edmac_config;
++ edmac->memcpy.device_pause = edmac_pause;
++ edmac->memcpy.device_resume = edmac_resume;
++ edmac->memcpy.device_terminate_all = edmac_terminate_all;
++ edmac->memcpy.directions = BIT(DMA_MEM_TO_MEM);
++ edmac->memcpy.residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT;
++
++ dma_cap_set(DMA_SLAVE, edmac->slave.cap_mask);
++ dma_cap_set(DMA_CYCLIC, edmac->slave.cap_mask);
++ edmac->slave.dev = &pdev->dev;
++ edmac->slave.device_free_chan_resources = edmac_free_chan_resources;
++ edmac->slave.device_tx_status = edmac_tx_status;
++ edmac->slave.device_issue_pending = edmac_issue_pending;
++ edmac->slave.device_prep_slave_sg = edmac_prep_slave_sg;
++ edmac->slave.device_prep_dma_cyclic = edmac_prep_dma_cyclic;
++ edmac->slave.device_config = edmac_config;
++ edmac->slave.device_resume = edmac_resume;
++ edmac->slave.device_pause = edmac_pause;
++ edmac->slave.device_terminate_all = edmac_terminate_all;
++ edmac->slave.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
++ edmac->slave.residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT;
++}
++
++static int edmacv310_init_chan(struct edmacv310_driver_data *edmac)
++{
++ int i, ret;
++ edmac->phy_chans = kzalloc((edmac->channels * sizeof(
++ struct edmacv310_phy_chan)),
++ GFP_KERNEL);
++ if (!edmac->phy_chans) {
++ edmacv310_error("malloc for phy chans fail!");
++ return -ENOMEM;
++ }
++
++ for (i = 0; i < edmac->channels; i++) {
++ struct edmacv310_phy_chan *phy_ch = &edmac->phy_chans[i];
++ phy_ch->id = i;
++ phy_ch->base = edmac->base + edmac_cx_base(i);
++ spin_lock_init(&phy_ch->lock);
++ phy_ch->serving = NULL;
++ }
++
++ ret = edmac_init_virt_channels(edmac, &edmac->memcpy, edmac->channels,
++ false);
++ if (ret) {
++ edmacv310_error("fail to init memory virt channels!");
++ goto free_phychans;
++ }
++
++ ret = edmac_init_virt_channels(edmac, &edmac->slave, edmac->slave_requests,
++ true);
++ if (ret) {
++ edmacv310_error("fail to init slave virt channels!");
++ goto free_memory_virt_channels;
++ }
++ return 0;
++
++free_memory_virt_channels:
++ edmac_free_virt_channels(&edmac->memcpy);
++free_phychans:
++ kfree(edmac->phy_chans);
++ return -ENOMEM;
++}
++
++static void edmacv310_free_chan(struct edmacv310_driver_data *edmac)
++{
++ edmac_free_virt_channels(&edmac->slave);
++ edmac_free_virt_channels(&edmac->memcpy);
++ kfree(edmac->phy_chans);
++}
++
++static void edmacv310_prep_phy_device(const struct edmacv310_driver_data *edmac)
++{
++ clk_prepare_enable(edmac->clk);
++ clk_prepare_enable(edmac->axi_clk);
++ reset_control_deassert(edmac->rstc);
++
++ edmacv310_writel(EDMAC_ALL_CHAN_CLR, edmac->base + EDMAC_INT_TC1_RAW);
++ edmacv310_writel(EDMAC_ALL_CHAN_CLR, edmac->base + EDMAC_INT_TC2_RAW);
++ edmacv310_writel(EDMAC_ALL_CHAN_CLR, edmac->base + EDMAC_INT_ERR1_RAW);
++ edmacv310_writel(EDMAC_ALL_CHAN_CLR, edmac->base + EDMAC_INT_ERR2_RAW);
++ edmacv310_writel(EDMAC_ALL_CHAN_CLR, edmac->base + EDMAC_INT_ERR3_RAW);
++ edmacv310_writel(EDMAC_INT_ENABLE_ALL_CHAN,
++ edmac->base + EDMAC_INT_TC1_MASK);
++ edmacv310_writel(EDMAC_INT_ENABLE_ALL_CHAN,
++ edmac->base + EDMAC_INT_TC2_MASK);
++ edmacv310_writel(EDMAC_INT_ENABLE_ALL_CHAN,
++ edmac->base + EDMAC_INT_ERR1_MASK);
++ edmacv310_writel(EDMAC_INT_ENABLE_ALL_CHAN,
++ edmac->base + EDMAC_INT_ERR2_MASK);
++ edmacv310_writel(EDMAC_INT_ENABLE_ALL_CHAN,
++ edmac->base + EDMAC_INT_ERR3_MASK);
++}
++
++static struct edmacv310_driver_data *edmacv310_prep_edmac_device(struct platform_device *pdev)
++{
++ int ret;
++ struct edmacv310_driver_data *edmac = NULL;
++ ssize_t trasfer_size;
++
++ ret = dma_set_mask_and_coherent(&(pdev->dev), DMA_BIT_MASK(64));
++ if (ret)
++ return NULL;
++
++ edmac = kzalloc(sizeof(*edmac), GFP_KERNEL);
++ if (!edmac) {
++ edmacv310_error("malloc for edmac fail!");
++ return NULL;
++ }
++
++ edmac->dev = pdev;
++
++ ret = get_of_probe(edmac);
++ if (ret) {
++ edmacv310_error("get dts info fail!");
++ goto free_edmac;
++ }
++
++ edmacv310_prep_dma_device(pdev, edmac);
++ edmac->max_transfer_size = MAX_TRANSFER_BYTES;
++ trasfer_size = MAX_TSFR_LLIS * EDMACV300_LLI_WORDS * sizeof(u32);
++
++ edmac->pool = dma_pool_create(DRIVER_NAME, &(pdev->dev),
++ trasfer_size, EDMACV300_POOL_ALIGN, 0);
++ if (!edmac->pool) {
++ edmacv310_error("create pool fail!");
++ goto free_edmac;
++ }
++
++ ret = edmacv310_init_chan(edmac);
++ if (ret)
++ goto free_pool;
++
++ return edmac;
++
++free_pool:
++ dma_pool_destroy(edmac->pool);
++free_edmac:
++ kfree(edmac);
++ return NULL;
++}
++
++static void free_edmac_device(struct edmacv310_driver_data *edmac)
++{
++ edmacv310_free_chan(edmac);
++ dma_pool_destroy(edmac->pool);
++ kfree(edmac);
++}
++
++static int __init edmacv310_probe(struct platform_device *pdev)
++{
++ int ret;
++ struct edmacv310_driver_data *edmac = NULL;
++
++ edmac = edmacv310_prep_edmac_device(pdev);
++ if (edmac == NULL)
++ return -ENOMEM;
++
++ ret = request_irq(edmac->irq, emdacv310_irq, 0, DRIVER_NAME, edmac);
++ if (ret) {
++ edmacv310_error("fail to request irq");
++ goto free_edmac;
++ }
++ edmacv310_prep_phy_device(edmac);
++ ret = dma_async_device_register(&edmac->memcpy);
++ if (ret) {
++ edmacv310_error("%s failed to register memcpy as an async device - %d\n", __func__, ret);
++ goto free_irq_res;
++ }
++
++ ret = dma_async_device_register(&edmac->slave);
++ if (ret) {
++ edmacv310_error("%s failed to register slave as an async device - %d\n", __func__, ret);
++ goto free_memcpy_device;
++ }
++ return 0;
++
++free_memcpy_device:
++ dma_async_device_unregister(&edmac->memcpy);
++free_irq_res:
++ free_irq(edmac->irq, edmac);
++free_edmac:
++ free_edmac_device(edmac);
++ return -ENOMEM;
++}
++
++static int emda_remove(struct platform_device *pdev)
++{
++ int err = 0;
++ return err;
++}
++
++static const struct of_device_id edmacv310_match[] = {
++ { .compatible = "vendor,edmacv310" },
++ {},
++};
++
++static struct platform_driver edmacv310_driver = {
++ .remove = emda_remove,
++ .driver = {
++ .name = "edmacv310",
++ .of_match_table = edmacv310_match,
++ },
++};
++
++static int __init edmacv310_init(void)
++{
++ return platform_driver_probe(&edmacv310_driver, edmacv310_probe);
++}
++subsys_initcall(edmacv310_init);
++
++static void __exit edmacv310_exit(void)
++{
++ platform_driver_unregister(&edmacv310_driver);
++}
++module_exit(edmacv310_exit);
++
++MODULE_LICENSE("GPL");
+diff --git a/drivers/dma/edmacv310.h b/drivers/dma/edmacv310.h
+new file mode 100644
+index 000000000000..2a266f3a0767
+--- /dev/null
++++ b/drivers/dma/edmacv310.h
+@@ -0,0 +1,147 @@
++/*
++ *
++ * Copyright (c) 2015-2021 Shenshu Technologies Co., Ltd.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#ifndef __EDMACV310_H__
++#define __EDMACV310_H__
++
++/* debug control */
++#define EDMACV310_CONFIG_TRACE_LEVEL 3
++#define EDMACV310_TRACE_LEVEL 0
++#define EDMACV310_REG_TRACE_LEVEL 3
++#define EDMACV310_TRACE_FMT KERN_INFO
++
++#ifdef DEBUG_EDMAC
++#define edmacv310_trace(level, msg...) do { \
++ if ((level) >= EDMACV310_TRACE_LEVEL) { \
++ printk(EDMACV310_TRACE_FMT"%s:%d: ", __func__, __LINE__); \
++ printk(msg); \
++ printk("\n"); \
++ } \
++} while (0)
++
++
++#define edmacv310_assert(cond) do { \
++ if (!(cond)) { \
++ printk(KERN_ERR "Assert:edmacv310:%s:%d\n", \
++ __func__, \
++ __LINE__); \
++ BUG(); \
++ } \
++} while (0)
++
++#define edmacv310_error(s...) do { \
++ printk(KERN_ERR "edmacv310:%s:%d: ", __func__, __LINE__); \
++ printk(s); \
++ printk("\n"); \
++} while (0)
++
++#else
++
++#define edmacv310_trace(level, msg...)
++#define edmacv310_assert(level, msg...)
++#define edmacv310_error(level, msg...)
++
++#endif
++
++#define edmacv310_readl(addr) ((unsigned int)readl((void *)(addr)))
++
++#define edmacv310_writel(v, addr) do { writel(v, (void *)(addr)); \
++} while (0)
++
++
++#define MAX_TRANSFER_BYTES 0xffff
++
++/* reg offset */
++#define EDMAC_INT_STAT 0x0
++#define EDMAC_INT_TC1 0x4
++#define EDMAC_INT_TC2 0x8
++#define EDMAC_INT_ERR1 0xc
++#define EDMAC_INT_ERR2 0x10
++#define EDMAC_INT_ERR3 0x14
++
++#define EDMAC_INT_TC1_MASK 0x18
++#define EDMAC_INT_TC2_MASK 0x1c
++#define EDMAC_INT_ERR1_MASK 0x20
++#define EDMAC_INT_ERR2_MASK 0x24
++#define EDMAC_INT_ERR3_MASK 0x28
++
++#define EDMAC_INT_TC1_RAW 0x600
++#define EDMAC_INT_TC2_RAW 0x608
++#define EDMAC_INT_ERR1_RAW 0x610
++#define EDMAC_INT_ERR2_RAW 0x618
++#define EDMAC_INT_ERR3_RAW 0x620
++
++#define edmac_cx_curr_cnt0(cn) (0x404 + (cn) * 0x20)
++#define edmac_cx_curr_src_addr_l(cn) (0x408 + (cn) * 0x20)
++#define edmac_cx_curr_src_addr_h(cn) (0x40c + (cn) * 0x20)
++#define edmac_cx_curr_dest_addr_l(cn) (0x410 + (cn) * 0x20)
++#define edmac_cx_curr_dest_addr_h(cn) (0x414 + (cn) * 0x20)
++
++#define EDMAC_CH_PRI 0x688
++#define EDMAC_CH_STAT 0x690
++#define EDMAC_DMA_CTRL 0x698
++
++#define edmac_cx_base(cn) (0x800 + (cn) * 0x40)
++#define edmac_cx_lli_l(cn) (0x800 + (cn) * 0x40)
++#define edmac_cx_lli_h(cn) (0x804 + (cn) * 0x40)
++#define edmac_cx_cnt0(cn) (0x81c + (cn) * 0x40)
++#define edmac_cx_src_addr_l(cn) (0x820 + (cn) * 0x40)
++#define edmac_cx_src_addr_h(cn) (0x824 + (cn) * 0x40)
++#define edmac_cx_dest_addr_l(cn) (0x828 + (cn) * 0x40)
++#define edmac_cx_dest_addr_h(cn) (0x82c + (cn) * 0x40)
++#define edmac_cx_config(cn) (0x830 + (cn) * 0x40)
++
++#define EDMAC_ALL_CHAN_CLR 0xff
++#define EDMAC_INT_ENABLE_ALL_CHAN 0xff
++
++
++#define EDMAC_CONFIG_SRC_INC (1 << 31)
++#define EDMAC_CONFIG_DST_INC (1 << 30)
++
++#define EDMAC_CONFIG_SRC_WIDTH_SHIFT 16
++#define EDMAC_CONFIG_DST_WIDTH_SHIFT 12
++#define EDMAC_WIDTH_8BIT 0b0
++#define EDMAC_WIDTH_16BIT 0b1
++#define EDMAC_WIDTH_32BIT 0b10
++#define EDMAC_WIDTH_64BIT 0b11
++#ifdef CONFIG_64BIT
++#define EDMAC_MEM_BIT_WIDTH EDMAC_WIDTH_64BIT
++#else
++#define EDMAC_MEM_BIT_WIDTH EDMAC_WIDTH_32BIT
++#endif
++
++#define EDMAC_MAX_BURST_WIDTH 16
++#define EDMAC_MIN_BURST_WIDTH 1
++#define EDMAC_CONFIG_SRC_BURST_SHIFT 24
++#define EDMAC_CONFIG_DST_BURST_SHIFT 20
++
++#define EDMAC_LLI_ALIGN 0x40
++#define EDMAC_LLI_DISABLE 0x0
++#define EDMAC_LLI_ENABLE 0x2
++
++#define EDMAC_CXCONFIG_SIGNAL_SHIFT 0x4
++#define EDMAC_CXCONFIG_MEM_TYPE 0x0
++#define EDMAC_CXCONFIG_DEV_MEM_TYPE 0x1
++#define EDMAC_CXCONFIG_TSF_TYPE_SHIFT 0x2
++#define EDMAC_CXCONFIG_LLI_START 0x1
++
++#define EDMAC_CXCONFIG_ITC_EN 0x1
++#define EDMAC_CXCONFIG_ITC_EN_SHIFT 0x1
++
++#define CCFG_EN 0x1
++
++#define EDMAC_CONTROL_SRC_WIDTH_MASK GENMASK(18, 16)
++#define EDMAC_CONTROL_DST_WIDTH_MASK GENMASK(14, 12)
++#endif
+diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c
+index f1b53dd1df1a..602c9c4eab41 100644
+--- a/drivers/gpio/gpio-pl061.c
++++ b/drivers/gpio/gpio-pl061.c
+@@ -289,6 +289,9 @@ static int pl061_probe(struct amba_device *adev, const struct amba_id *id)
+ struct pl061 *pl061;
+ struct gpio_irq_chip *girq;
+ int ret, irq;
++#ifdef CONFIG_ARCH_BSP
++ int gpio_idx;
++#endif
+
+ pl061 = devm_kzalloc(dev, sizeof(*pl061), GFP_KERNEL);
+ if (pl061 == NULL)
+@@ -301,7 +304,19 @@ static int pl061_probe(struct amba_device *adev, const struct amba_id *id)
+ raw_spin_lock_init(&pl061->lock);
+ pl061->gc.request = gpiochip_generic_request;
+ pl061->gc.free = gpiochip_generic_free;
++#ifdef CONFIG_ARCH_BSP
++ if (dev->of_node) {
++ gpio_idx = of_alias_get_id(dev->of_node, "gpio");
++ if (gpio_idx < 0)
++ return -ENOMEM;
++ pl061->gc.base = gpio_idx * PL061_GPIO_NR;
++ }
++
++ if (pl061->gc.base < 0)
++ pl061->gc.base = -1;
++#else
+ pl061->gc.base = -1;
++#endif
+ pl061->gc.get_direction = pl061_get_direction;
+ pl061->gc.direction_input = pl061_direction_input;
+ pl061->gc.direction_output = pl061_direction_output;
+diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
+index 5763a1e9360b..027957dc0a20 100644
+--- a/drivers/i2c/busses/Kconfig
++++ b/drivers/i2c/busses/Kconfig
+@@ -649,6 +649,16 @@ config I2C_GPIO_FAULT_INJECTOR
+ faults to an I2C bus, so another bus master can be stress-tested.
+ This is for debugging. If unsure, say 'no'.
+
++config I2C_BSP
++ tristate "Vendor I2C Controller"
++ depends on ARCH_BSP
++ help
++ Say Y here to include support for Vendor I2C controller in the
++ Vendor SoCs.
++
++ This driver can also be built as a module. If so, the module
++ will be called i2c-bsp.
++
+ config I2C_HIGHLANDER
+ tristate "Highlander FPGA SMBus interface"
+ depends on SH_HIGHLANDER || COMPILE_TEST
+@@ -1448,4 +1458,21 @@ config I2C_FSI
+ This driver can also be built as a module. If so, the module will be
+ called as i2c-fsi.
+
++config DMA_MSG_MIN_LEN
++ int "Vendor I2C support DMA minimum LEN"
++ depends on I2C_BSP
++ range 1 4090
++ default 5
++ help
++ The i2c_msg minimum LEN of i2c support DMA,range from 1 to 4091
++
++config DMA_MSG_MAX_LEN
++ int "Vendor I2C support DMA maximum LEN"
++ depends on I2C_BSP
++ range DMA_MSG_MIN_LEN 4090
++ default 4090
++ help
++ The i2c_msg maximum LEN of i2c support DMA,range from i2c_msg minimum LEN to 4090,
++ because DMA for 0xFFC one-time largest data transfers;
++
+ endmenu
+diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
+index 280e05622d50..ca908fffc09b 100644
+--- a/drivers/i2c/busses/Makefile
++++ b/drivers/i2c/busses/Makefile
+@@ -67,6 +67,7 @@ obj-$(CONFIG_I2C_EG20T) += i2c-eg20t.o
+ obj-$(CONFIG_I2C_EMEV2) += i2c-emev2.o
+ obj-$(CONFIG_I2C_EXYNOS5) += i2c-exynos5.o
+ obj-$(CONFIG_I2C_GPIO) += i2c-gpio.o
++obj-$(CONFIG_I2C_BSP) += i2c-bsp.o
+ obj-$(CONFIG_I2C_HIGHLANDER) += i2c-highlander.o
+ obj-$(CONFIG_I2C_HISI) += i2c-hisi.o
+ obj-$(CONFIG_I2C_HIX5HD2) += i2c-hix5hd2.o
+diff --git a/drivers/i2c/busses/i2c-bsp.c b/drivers/i2c/busses/i2c-bsp.c
+new file mode 100644
+index 000000000000..4147d18911ce
+--- /dev/null
++++ b/drivers/i2c/busses/i2c-bsp.c
+@@ -0,0 +1,1534 @@
++/*
++ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2020-2023. All rights reserved.
++ */
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++#if defined(CONFIG_EDMAC)
++#include
++#include
++
++/*
++ * In the case of enable edmacv310_n, msg->buf must be continuous memory, for DMA processing.
++ * Mostly dma_xfer_* have to handle the uncontinuous memory. So i2c_bsp allocate
++ * continuous memory for msg->buf and use highmem_buf_list to manage msg->buf allocated by i2c_bsp.
++ */
++struct highmem_buf_list_node {
++ __u8 *buf;
++ __u8 *highmem_buf;
++ struct i2c_msg *msg;
++ struct list_head node;
++};
++
++static LIST_HEAD(highmem_buf_list);
++
++static struct highmem_buf_list_node *search_in_highmem_buf_list(struct i2c_msg *msg)
++{
++ struct highmem_buf_list_node *highmem_buf_node = NULL;
++ struct highmem_buf_list_node *_highmem_buf_node = NULL;
++
++ list_for_each_entry_safe(highmem_buf_node, _highmem_buf_node, &highmem_buf_list, node) {
++ if (highmem_buf_node->msg == msg) {
++ return highmem_buf_node;
++ }
++ }
++ return NULL;
++}
++#endif
++
++#ifdef DEBUG_BSP_I2C
++#define debug_dump_i2c_msg(msg) \
++ do { \
++ printk("%s::%d\n", __FILE__, __LINE__); \
++ dump_i2c_msg(msg); \
++ } while(0)
++
++static void dump_i2c_msg(struct i2c_msg *msg)
++{
++ int i = 0;
++ printk("msg->addr: %u\n", (unsigned int)msg->addr);
++ printk("msg->flags:%u\n", (unsigned int)msg->flags);
++ printk("msg->len: %u\n", (unsigned int)msg->len);
++ for (; i < msg->len; i++) {
++ printk("%d %x\n", i, msg->buf[i]);
++ }
++}
++#else
++#define debug_dump_i2c_msg(msg)
++#endif
++
++/*
++ * I2C Registers offsets
++ */
++#define BSP_I2C_GLB 0x0
++#define BSP_I2C_SCL_H 0x4
++#define BSP_I2C_SCL_L 0x8
++#define BSP_I2C_DATA1 0x10
++#define BSP_I2C_TXF 0x20
++#define BSP_I2C_RXF 0x24
++#define BSP_I2C_CMD_BASE 0x30
++#define BSP_I2C_LOOP1 0xb0
++#define BSP_I2C_DST1 0xb4
++#define BSP_I2C_LOOP2 0xb8
++#define BSP_I2C_DST2 0xbc
++#define BSP_I2C_TX_WATER 0xc8
++#define BSP_I2C_RX_WATER 0xcc
++#define BSP_I2C_CTRL1 0xd0
++#define BSP_I2C_CTRL2 0xd4
++#define BSP_I2C_STAT 0xd8
++#define BSP_I2C_INTR_RAW 0xe0
++#define BSP_I2C_INTR_EN 0xe4
++#define BSP_I2C_INTR_STAT 0xe8
++
++/*
++ * I2C Global Config Register -- BSP_I2C_GLB
++ */
++#define GLB_EN_MASK BIT(0)
++#define GLB_SDA_HOLD_MASK GENMASK(23, 8)
++#define GLB_SDA_HOLD_SHIFT (8)
++#define should_copy_to_continuous_mem(addr) true
++
++/*
++ * I2C Timing CMD Register -- BSP_I2C_CMD_BASE + n * 4 (n = 0, 1, 2, ... 31)
++ */
++#define CMD_EXIT 0x0
++#define CMD_TX_S 0x1
++#define CMD_TX_D1_2 0x4
++#define CMD_TX_D1_1 0x5
++#define CMD_TX_FIFO 0x9
++#define CMD_RX_FIFO 0x12
++#define CMD_RX_ACK 0x13
++#define CMD_IGN_ACK 0x15
++#define CMD_TX_ACK 0x16
++#define CMD_TX_NACK 0x17
++#define CMD_JMP1 0x18
++#define CMD_JMP2 0x19
++#define CMD_UP_TXF 0x1d
++#define CMD_TX_RS 0x1e
++#define CMD_TX_P 0x1f
++
++/*
++ * I2C Control Register 1 -- BSP_I2C_CTRL1
++ */
++#define CTRL1_CMD_START_MASK BIT(0)
++#define CTRL1_DMA_OP_MASK (0x3 << 8)
++#define CTRL1_DMA_R (0x3 << 8)
++#define CTRL1_DMA_W (0x2 << 8)
++
++/*
++ * I2C Status Register -- BSP_I2C_STAT
++ */
++#define STAT_RXF_NOE_MASK BIT(16) /* RX FIFO not empty flag */
++#define STAT_TXF_NOF_MASK BIT(19) /* TX FIFO not full flag */
++
++/*
++ * I2C Interrupt status and mask Register --
++ * BSP_I2C_INTR_RAW, BSP_I2C_STAT, BSP_I2C_INTR_STAT
++ */
++#define INTR_ABORT_MASK (BIT(0) | BIT(11))
++#define INTR_RX_MASK BIT(2)
++#define INTR_TX_MASK BIT(4)
++#define INTR_CMD_DONE_MASK BIT(12)
++#define INTR_USE_MASK (INTR_ABORT_MASK \
++ |INTR_RX_MASK \
++ | INTR_TX_MASK \
++ | INTR_CMD_DONE_MASK)
++#define INTR_ALL_MASK GENMASK(31, 0)
++
++#define I2C_DEFAULT_FREQUENCY 100000
++#define I2C_TXF_DEPTH 64
++#define I2C_RXF_DEPTH 64
++#define I2C_TXF_WATER 32
++#define I2C_RXF_WATER 32
++#define I2C_WAIT_TIMEOUT 0x400
++#define I2C_IRQ_TIMEOUT (msecs_to_jiffies(1000))
++
++struct bsp_i2c_dev {
++ struct device *dev;
++ struct i2c_adapter adap;
++ resource_size_t phybase;
++ void __iomem *base;
++ struct clk *clk;
++ int irq;
++
++ unsigned int freq;
++ struct i2c_msg *msg;
++ unsigned int msg_num;
++ unsigned int msg_idx;
++ unsigned int msg_buf_ptr;
++ struct completion msg_complete;
++
++ spinlock_t lock;
++ int status;
++};
++static inline void bsp_i2c_disable(const struct bsp_i2c_dev *i2c);
++static inline void bsp_i2c_cfg_irq(const struct bsp_i2c_dev *i2c,
++ unsigned int flag);
++static inline unsigned int bsp_i2c_clr_irq(const struct bsp_i2c_dev *i2c);
++static inline void bsp_i2c_enable(const struct bsp_i2c_dev *i2c);
++
++#define CHECK_SDA_IN_SHIFT (16)
++#define GPIO_MODE_SHIFT (8)
++#define FORCE_SCL_OEN_SHIFT (4)
++#define FORCE_SDA_OEN_SHIFT (0)
++
++static void bsp_i2c_rescue(const struct bsp_i2c_dev *i2c)
++{
++ unsigned int val;
++ unsigned int time_cnt;
++ int index;
++
++ bsp_i2c_disable(i2c);
++ bsp_i2c_cfg_irq(i2c, 0);
++ bsp_i2c_clr_irq(i2c);
++
++ val = (0x1 << GPIO_MODE_SHIFT) | (0x1 << FORCE_SCL_OEN_SHIFT) |
++ (0x1 << FORCE_SDA_OEN_SHIFT);
++ writel(val, i2c->base + BSP_I2C_CTRL2);
++
++ time_cnt = 0;
++ do {
++ for (index = 0; index < 9; index++) { /* Cycle ten times */
++ val = (0x1 << GPIO_MODE_SHIFT) | 0x1;
++ writel(val, i2c->base + BSP_I2C_CTRL2);
++
++ udelay(5); /* delay 5 us */
++
++ val = (0x1 << GPIO_MODE_SHIFT) | (0x1 << FORCE_SCL_OEN_SHIFT) |
++ (0x1 << FORCE_SDA_OEN_SHIFT);
++ writel(val, i2c->base + BSP_I2C_CTRL2);
++
++ udelay(5); /* delay 5 us */
++ }
++
++ time_cnt++;
++ if (time_cnt > I2C_WAIT_TIMEOUT) {
++ dev_err(i2c->dev, "wait Timeout!\n");
++ goto disable_rescue;
++ }
++
++ val = readl(i2c->base + BSP_I2C_CTRL2);
++ } while (!(val & (0x1 << CHECK_SDA_IN_SHIFT)));
++
++ val = (0x1 << GPIO_MODE_SHIFT) | (0x1 << FORCE_SCL_OEN_SHIFT) |
++ (0x1 << FORCE_SDA_OEN_SHIFT);
++ writel(val, i2c->base + BSP_I2C_CTRL2);
++
++ val = (0x1 << GPIO_MODE_SHIFT) | (0x1 << FORCE_SCL_OEN_SHIFT);
++ writel(val, i2c->base + BSP_I2C_CTRL2);
++
++ udelay(10); /* delay 10 us */
++
++ val = (0x1 << GPIO_MODE_SHIFT) | (0x1 << FORCE_SCL_OEN_SHIFT) |
++ (0x1 << FORCE_SDA_OEN_SHIFT);
++ writel(val, i2c->base + BSP_I2C_CTRL2);
++
++disable_rescue:
++ val = (0x1 << FORCE_SCL_OEN_SHIFT) | 0x1;
++ writel(val, i2c->base + BSP_I2C_CTRL2);
++}
++
++static inline void bsp_i2c_disable(const struct bsp_i2c_dev *i2c)
++{
++ unsigned int val;
++
++ val = readl(i2c->base + BSP_I2C_GLB);
++ val &= ~GLB_EN_MASK;
++ writel(val, i2c->base + BSP_I2C_GLB);
++}
++
++static inline void bsp_i2c_enable(const struct bsp_i2c_dev *i2c)
++{
++ unsigned int val;
++
++ val = readl(i2c->base + BSP_I2C_GLB);
++ val |= GLB_EN_MASK;
++ writel(val, i2c->base + BSP_I2C_GLB);
++}
++
++static inline void bsp_i2c_cfg_irq(const struct bsp_i2c_dev *i2c,
++ unsigned int flag)
++{
++ writel(flag, i2c->base + BSP_I2C_INTR_EN);
++}
++
++static void bsp_i2c_disable_irq(const struct bsp_i2c_dev *i2c,
++ unsigned int flag)
++{
++ unsigned int val;
++
++ val = readl(i2c->base + BSP_I2C_INTR_EN);
++ val &= ~flag;
++ writel(val, i2c->base + BSP_I2C_INTR_EN);
++}
++
++static unsigned int bsp_i2c_clr_irq(const struct bsp_i2c_dev *i2c)
++{
++ unsigned int val;
++
++ val = readl(i2c->base + BSP_I2C_INTR_STAT);
++ writel(INTR_ALL_MASK, i2c->base + BSP_I2C_INTR_RAW);
++
++ return val;
++}
++
++static inline void bsp_i2c_cmdreg_set(const struct bsp_i2c_dev *i2c,
++ unsigned int cmd, unsigned int *offset)
++{
++ dev_dbg(i2c->dev, "i2c reg: offset=0x%x, cmd=0x%x...\n", *offset * 4, cmd);
++ /* Register bit width */
++ writel(cmd, i2c->base + BSP_I2C_CMD_BASE + *offset * 4);
++ (*offset)++;
++}
++
++/*
++ * config i2c slave addr
++ */
++static void bsp_i2c_set_addr(const struct bsp_i2c_dev *i2c)
++{
++ struct i2c_msg *msg = i2c->msg;
++ u16 addr;
++
++ if (msg->flags & I2C_M_TEN) {
++ /* First byte is 11110XX0 where XX is upper 2 bits */
++ addr = ((msg->addr & 0x300) << 1) | 0xf000;
++ if (msg->flags & I2C_M_RD)
++ addr |= 1 << 8; /* Shift the read flag to the left by eight bits */
++
++ /* Second byte is the remaining 8 bits */
++ addr |= msg->addr & 0xff;
++ } else {
++ addr = (msg->addr & 0x7f) << 1;
++ if (msg->flags & I2C_M_RD)
++ addr |= 1;
++ }
++
++ writel(addr, i2c->base + BSP_I2C_DATA1);
++}
++
++/*
++ * Start command sequence
++ */
++static inline void bsp_i2c_start_cmd(const struct bsp_i2c_dev *i2c)
++{
++ unsigned int val;
++
++ val = readl(i2c->base + BSP_I2C_CTRL1);
++ val |= CTRL1_CMD_START_MASK;
++ writel(val, i2c->base + BSP_I2C_CTRL1);
++}
++
++static int bsp_i2c_wait_rx_noempty(const struct bsp_i2c_dev *i2c)
++{
++ unsigned int time_cnt = 0;
++ unsigned int val;
++
++ do {
++ val = readl(i2c->base + BSP_I2C_STAT);
++ if (val & STAT_RXF_NOE_MASK)
++ return 0;
++
++ udelay(50); /* delay 50 us */
++ } while (time_cnt++ < I2C_WAIT_TIMEOUT);
++
++ bsp_i2c_rescue(i2c);
++
++ dev_err(i2c->dev, "wait rx no empty timeout, RIS: 0x%x, SR: 0x%x\n",
++ readl(i2c->base + BSP_I2C_INTR_RAW), val);
++ return -EIO;
++}
++
++static int bsp_i2c_wait_tx_nofull(const struct bsp_i2c_dev *i2c)
++{
++ unsigned int time_cnt = 0;
++ unsigned int val;
++
++ do {
++ val = readl(i2c->base + BSP_I2C_STAT);
++ if (val & STAT_TXF_NOF_MASK)
++ return 0;
++
++ udelay(50); /* delay 50 us */
++ } while (time_cnt++ < I2C_WAIT_TIMEOUT);
++
++ bsp_i2c_rescue(i2c);
++
++ dev_err(i2c->dev, "wait rx no empty timeout, RIS: 0x%x, SR: 0x%x\n",
++ readl(i2c->base + BSP_I2C_INTR_RAW), val);
++ return -EIO;
++}
++
++static int bsp_i2c_wait_idle(const struct bsp_i2c_dev *i2c)
++{
++ unsigned int time_cnt = 0;
++ unsigned int val;
++
++ do {
++ val = readl(i2c->base + BSP_I2C_INTR_RAW);
++ if (val & (INTR_ABORT_MASK)) {
++ dev_err(i2c->dev, "wait idle abort!, RIS: 0x%x\n",
++ val);
++ return -EIO;
++ }
++
++ if (val & INTR_CMD_DONE_MASK)
++ return 0;
++
++ udelay(50); /* delay 50 us */
++ } while (time_cnt++ < I2C_WAIT_TIMEOUT);
++
++ bsp_i2c_rescue(i2c);
++
++ dev_err(i2c->dev, "wait idle timeout, RIS: 0x%x, SR: 0x%x\n",
++ val, readl(i2c->base + BSP_I2C_STAT));
++
++ return -EIO;
++}
++
++static void bsp_i2c_set_freq(struct bsp_i2c_dev *i2c)
++{
++ unsigned int max_freq, freq;
++ unsigned int clk_rate;
++ unsigned int val;
++
++ freq = i2c->freq;
++ clk_rate = clk_get_rate(i2c->clk);
++ max_freq = clk_rate >> 1;
++
++ if (freq > max_freq) {
++ i2c->freq = max_freq;
++ freq = i2c->freq;
++ }
++
++ if (!freq) {
++ pr_err("bsp_i2c_set_freq:freq can't be zero!");
++ return;
++ }
++ /* If the frequency band is less than or equal to 100 MHz, the standard mode is used */
++ if (freq <= 100000) {
++ /* in normal mode F_scl: freq
++ i2c_scl_hcnt = (F_i2c / F_scl) * 0.5
++ i2c_scl_hcnt = (F_i2c / F_scl) * 0.5
++ */
++ val = clk_rate / (freq * 2);
++ writel(val, i2c->base + BSP_I2C_SCL_H);
++ writel(val, i2c->base + BSP_I2C_SCL_L);
++ } else {
++ /* in fast mode F_scl: freq
++ i2c_scl_hcnt = (F_i2c / F_scl) * 0.36
++ i2c_scl_hcnt = (F_i2c / F_scl) * 0.64
++ */
++ val = ((clk_rate / 100) * 36) / freq;
++ writel(val, i2c->base + BSP_I2C_SCL_H);
++ val = ((clk_rate / 100) * 64) / freq;
++ writel(val, i2c->base + BSP_I2C_SCL_L);
++ }
++
++ val = readl(i2c->base + BSP_I2C_GLB);
++ val &= ~GLB_SDA_HOLD_MASK;
++ val |= ((0xa << GLB_SDA_HOLD_SHIFT) & GLB_SDA_HOLD_MASK);
++ writel(val, i2c->base + BSP_I2C_GLB);
++}
++
++/*
++ * set i2c controller TX and RX FIFO water
++ */
++static inline void bsp_i2c_set_water(const struct bsp_i2c_dev *i2c)
++{
++ writel(I2C_TXF_WATER, i2c->base + BSP_I2C_TX_WATER);
++ writel(I2C_RXF_WATER, i2c->base + BSP_I2C_RX_WATER);
++}
++
++/*
++ * initialise the controller, set i2c bus interface freq
++ */
++static void bsp_i2c_hw_init(struct bsp_i2c_dev *i2c)
++{
++ bsp_i2c_disable(i2c);
++ bsp_i2c_disable_irq(i2c, INTR_ALL_MASK);
++ bsp_i2c_set_freq(i2c);
++ bsp_i2c_set_water(i2c);
++}
++
++/*
++ * bsp_i2c_cfg_cmd - config i2c controller command sequence
++ *
++ * After all the timing command is configured,
++ * and then start the command, you can i2c communication,
++ * and then only need to read and write i2c fifo.
++ */
++static void bsp_i2c_cfg_cmd(const struct bsp_i2c_dev *i2c)
++{
++ struct i2c_msg *msg = i2c->msg;
++ int offset = 0;
++
++ if (i2c->msg_idx == 0)
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_S, &offset);
++ else
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_RS, &offset);
++
++ if (msg->flags & I2C_M_TEN) {
++ if (i2c->msg_idx == 0) {
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_D1_2, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_D1_1, &offset);
++ } else {
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_D1_2, &offset);
++ }
++ } else {
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_D1_1, &offset);
++ }
++
++ if (msg->flags & I2C_M_IGNORE_NAK)
++ bsp_i2c_cmdreg_set(i2c, CMD_IGN_ACK, &offset);
++ else
++ bsp_i2c_cmdreg_set(i2c, CMD_RX_ACK, &offset);
++
++ if (msg->flags & I2C_M_RD) {
++ /* The extended address occupies two bytes */
++ if (msg->len >= 2) {
++ writel(offset, i2c->base + BSP_I2C_DST1);
++ /* The extended address occupies two bytes */
++ writel(msg->len - 2, i2c->base + BSP_I2C_LOOP1);
++ bsp_i2c_cmdreg_set(i2c, CMD_RX_FIFO, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_ACK, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_JMP1, &offset);
++ }
++ bsp_i2c_cmdreg_set(i2c, CMD_RX_FIFO, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_NACK, &offset);
++ } else {
++ writel(offset, i2c->base + BSP_I2C_DST1);
++ writel(msg->len - 1, i2c->base + BSP_I2C_LOOP1);
++ bsp_i2c_cmdreg_set(i2c, CMD_UP_TXF, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_FIFO, &offset);
++
++ if (msg->flags & I2C_M_IGNORE_NAK)
++ bsp_i2c_cmdreg_set(i2c, CMD_IGN_ACK, &offset);
++ else
++ bsp_i2c_cmdreg_set(i2c, CMD_RX_ACK, &offset);
++
++ bsp_i2c_cmdreg_set(i2c, CMD_JMP1, &offset);
++ }
++
++ if ((i2c->msg_idx == (i2c->msg_num - 1)) || (msg->flags & I2C_M_STOP)) {
++ dev_dbg(i2c->dev, "run to %s %d...TX STOP\n",
++ __func__, __LINE__);
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_P, &offset);
++ }
++
++ bsp_i2c_cmdreg_set(i2c, CMD_EXIT, &offset);
++}
++
++static void bsp_i2c_cfg_cmd_mul_reg(struct bsp_i2c_dev *i2c,unsigned int reg_data_width)
++{
++ struct i2c_msg *msg = i2c->msg;
++ int offset = 0;
++ int i;
++
++ if (i2c->msg_idx == 0)
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_S, &offset);
++ else
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_RS, &offset);
++
++ if (msg->flags & I2C_M_TEN) {
++ if (i2c->msg_idx == 0) {
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_D1_2, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_D1_1, &offset);
++ } else {
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_D1_2, &offset);
++ }
++ } else {
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_D1_1, &offset);
++ }
++
++ if (msg->flags & I2C_M_IGNORE_NAK)
++ bsp_i2c_cmdreg_set(i2c, CMD_IGN_ACK, &offset);
++ else
++ bsp_i2c_cmdreg_set(i2c, CMD_RX_ACK, &offset);
++
++ if (msg->flags & I2C_M_RD) {
++ /* The extended address occupies two bytes */
++ if (msg->len >= 2) {
++ writel(offset, i2c->base + BSP_I2C_DST1);
++ /* The extended address occupies two bytes */
++ writel(msg->len - 2, i2c->base + BSP_I2C_LOOP1);
++ bsp_i2c_cmdreg_set(i2c, CMD_RX_FIFO, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_ACK, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_JMP1, &offset);
++ }
++ bsp_i2c_cmdreg_set(i2c, CMD_RX_FIFO, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_NACK, &offset);
++ } else {
++ for(i = 0; i < reg_data_width - 1; i++){
++ bsp_i2c_cmdreg_set(i2c, CMD_UP_TXF, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_FIFO, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_RX_ACK, &offset);
++ }
++ bsp_i2c_cmdreg_set(i2c, CMD_UP_TXF, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_FIFO, &offset);
++ bsp_i2c_cmdreg_set(i2c, CMD_IGN_ACK, &offset);
++ }
++
++ bsp_i2c_cmdreg_set(i2c, CMD_TX_P, &offset);
++ if(((msg->len / reg_data_width) - 1) > 0){
++ writel(0, i2c->base + BSP_I2C_DST2);
++ writel((msg->len / reg_data_width) - 1, i2c->base + BSP_I2C_LOOP2);
++ bsp_i2c_cmdreg_set(i2c, CMD_JMP2, &offset);
++ }
++ bsp_i2c_cmdreg_set(i2c, CMD_EXIT, &offset);
++}
++
++static inline void check_i2c_send_complete(struct bsp_i2c_dev *i2c)
++{
++ unsigned int val;
++ val = readl(i2c->base + BSP_I2C_GLB);
++ if(val & GLB_EN_MASK){
++ bsp_i2c_wait_idle(i2c);
++ bsp_i2c_disable(i2c);
++ }
++}
++
++#if defined(CONFIG_EDMAC)
++int dma_to_i2c(unsigned long src, unsigned int dst, unsigned int length)
++{
++ int chan;
++
++ chan = do_dma_m2p(src, dst, length);
++ if (chan == -1)
++ pr_err("dma_to_i2c error\n");
++
++ return chan;
++}
++
++int i2c_to_dma(unsigned int src, unsigned long dst,
++ unsigned int length)
++{
++ int chan;
++
++ chan = do_dma_p2m(dst, src, length);
++ if (chan == -1)
++ pr_err("dma_p2m error...\n");
++
++ return chan;
++}
++
++static int bsp_i2c_do_dma_write(struct bsp_i2c_dev *i2c,
++ unsigned long dma_dst_addr)
++{
++ int chan, val;
++ int status = 0;
++ struct i2c_msg *msg = i2c->msg;
++
++ check_i2c_send_complete(i2c);
++ bsp_i2c_set_freq(i2c);
++ writel(0x1, i2c->base + BSP_I2C_TX_WATER);
++ bsp_i2c_enable(i2c);
++ bsp_i2c_clr_irq(i2c);
++ bsp_i2c_set_addr(i2c);
++ bsp_i2c_cfg_cmd(i2c);
++
++ /* transmit DATA from DMAC to I2C in DMA mode */
++ chan = dma_to_i2c(dma_dst_addr, (i2c->phybase + BSP_I2C_TXF),
++ msg->len);
++ if (chan == -1) {
++ status = -1;
++ goto fail_0;
++ }
++
++ val = readl(i2c->base + BSP_I2C_CTRL1);
++ val &= ~CTRL1_DMA_OP_MASK;
++ val |= CTRL1_DMA_W | CTRL1_CMD_START_MASK;
++ writel(val, i2c->base + BSP_I2C_CTRL1);
++
++ if (dmac_wait(chan) != DMAC_CHN_SUCCESS) {
++ status = -1;
++ goto fail_1;
++ }
++
++ status = bsp_i2c_wait_idle(i2c);
++
++fail_1:
++ dmac_channel_free((unsigned int)chan);
++fail_0:
++ bsp_i2c_disable(i2c);
++
++ return status;
++}
++
++static int bsp_i2c_do_dma_write_mul_reg(struct bsp_i2c_dev *i2c,
++ unsigned long dma_dst_addr, unsigned int reg_data_width)
++{
++ int chan;
++ int val = 0;
++ struct i2c_msg *msg = i2c->msg;
++
++ check_i2c_send_complete(i2c);
++ bsp_i2c_set_freq(i2c);
++ writel(0x1, i2c->base + BSP_I2C_TX_WATER);
++ bsp_i2c_enable(i2c);
++ bsp_i2c_clr_irq(i2c);
++ bsp_i2c_set_addr(i2c);
++ bsp_i2c_cfg_cmd_mul_reg(i2c, reg_data_width);
++
++ /* transmit DATA from DMAC to I2C in DMA mode */
++ chan = dma_to_i2c(dma_dst_addr, (i2c->phybase + BSP_I2C_TXF),
++ msg->len);
++ if (chan == -1)
++ return -1;
++
++ val = readl(i2c->base + BSP_I2C_CTRL1);
++ val &= ~CTRL1_DMA_OP_MASK;
++ val |= CTRL1_DMA_W | CTRL1_CMD_START_MASK;
++ writel(val, i2c->base + BSP_I2C_CTRL1);
++
++ return 0;
++}
++
++static int bsp_i2c_do_dma_read(struct bsp_i2c_dev *i2c,
++ unsigned long dma_dst_addr)
++{
++ int val, chan;
++ int status = 0;
++ struct i2c_msg *msg = i2c->msg;
++
++ check_i2c_send_complete(i2c);
++ bsp_i2c_set_freq(i2c);
++ writel(0x0, i2c->base + BSP_I2C_RX_WATER);
++ bsp_i2c_enable(i2c);
++ bsp_i2c_clr_irq(i2c);
++ bsp_i2c_set_addr(i2c);
++ bsp_i2c_cfg_cmd(i2c);
++
++ /* transmit DATA from I2C to DMAC in DMA mode */
++ chan = i2c_to_dma((i2c->phybase + BSP_I2C_RXF),
++ dma_dst_addr, msg->len);
++ if (chan == -1) {
++ status = -1;
++ goto fail_0;
++ }
++
++ val = readl(i2c->base + BSP_I2C_CTRL1);
++ val &= ~CTRL1_DMA_OP_MASK;
++ val |= CTRL1_CMD_START_MASK | CTRL1_DMA_R;
++ writel(val, i2c->base + BSP_I2C_CTRL1);
++
++ if (dmac_wait(chan) != DMAC_CHN_SUCCESS) {
++ status = -1;
++ goto fail_1;
++ }
++
++ status = bsp_i2c_wait_idle(i2c);
++
++fail_1:
++ dmac_channel_free((unsigned int)chan);
++fail_0:
++ bsp_i2c_disable(i2c);
++
++ return status;
++}
++
++/*
++ * Before the DMA transfer, the buffer allocated in high memory is copied to contiguous memory allocated
++ * by i2c_bsp and managed by the highmem_buf_list.
++ */
++static int copy_to_continuous_mem(struct bsp_i2c_dev *i2c)
++{
++ int ret;
++
++ struct highmem_buf_list_node *highmem_node = NULL;
++ if (should_copy_to_continuous_mem(i2c->msg->buf) && search_in_highmem_buf_list(i2c->msg) == NULL) {
++ highmem_node = (struct highmem_buf_list_node *)kzalloc(sizeof(*highmem_node), GFP_KERNEL | __GFP_ATOMIC);
++ if (highmem_node == NULL) {
++ dev_err(i2c->dev, "Allocate memory fail.\n");
++ return -EINVAL;
++ }
++
++ highmem_node->msg = i2c->msg;
++ highmem_node->highmem_buf = i2c->msg->buf;
++ i2c->msg->buf = kmalloc(i2c->msg->len, GFP_KERNEL | __GFP_ATOMIC);
++ highmem_node->buf = i2c->msg->buf;
++ ret = memcpy_s(highmem_node->buf, i2c->msg->len,
++ highmem_node->highmem_buf, i2c->msg->len);
++ if (ret) {
++ dev_err(i2c->dev, "%s, memcpy_s failed!\n", __func__);
++ return ret;
++ }
++
++ if (i2c->msg->buf == NULL) {
++ i2c->msg->buf = highmem_node->highmem_buf;
++ kfree(highmem_node);
++ dev_err(i2c->dev, "Allocate continuous memory fail.\n");
++ return -EINVAL;
++ }
++
++ list_add_tail(&highmem_node->node, &highmem_buf_list);
++ }
++ return 0;
++}
++
++/*
++ * When the DMA transfer ends, the high memory buf is returned to the
++ * i2c->msg so that the user mode can read and release the buffer,
++ * and the contiguous memory allocated by i2c_bsp will be released.
++ */
++static void released_contiguous_buf_from_list(struct i2c_msg *msg)
++{
++ struct highmem_buf_list_node *highmem_node = NULL;
++ int ret;
++
++ debug_dump_i2c_msg(msg);
++ highmem_node = search_in_highmem_buf_list(msg);
++ if (highmem_node != NULL) {
++ ret = memcpy_s(highmem_node->highmem_buf, msg->len,
++ highmem_node->buf, msg->len);
++ if (ret) {
++ printk("%s, memcpy_s failed\n", __func__);
++ return;
++ }
++
++ list_del(&highmem_node->node);
++ kfree(highmem_node->buf);
++ msg->buf = highmem_node->highmem_buf;
++ kfree(highmem_node);
++ }
++
++ debug_dump_i2c_msg(msg);
++}
++
++static int bsp_i2c_dma_xfer_one_msg(struct bsp_i2c_dev *i2c)
++{
++ unsigned int status;
++ struct i2c_msg *msg = i2c->msg;
++ dma_addr_t dma_dst_addr;
++
++ dev_dbg(i2c->dev, "[%s,%d]msg->flags=0x%x, len=0x%x\n",
++ __func__, __LINE__, msg->flags, msg->len);
++
++ debug_dump_i2c_msg(msg);
++ if (copy_to_continuous_mem(i2c))
++ return -EINVAL;
++
++ debug_dump_i2c_msg(msg);
++ if (msg->flags & I2C_M_RD) {
++ mb();
++ dma_dst_addr = dma_map_single(i2c->dev, msg->buf,
++ msg->len, DMA_FROM_DEVICE);
++ status = dma_mapping_error(i2c->dev, dma_dst_addr);
++ if (status) {
++ dev_err(i2c->dev, "DMA mapping failed\n");
++ goto out;
++ }
++
++ status = bsp_i2c_do_dma_read(i2c, dma_dst_addr);
++
++ dma_unmap_single(i2c->dev, dma_dst_addr, msg->len, DMA_FROM_DEVICE);
++ mb();
++ } else {
++ mb();
++ dma_dst_addr = dma_map_single(i2c->dev, msg->buf,
++ msg->len, DMA_TO_DEVICE);
++ status = dma_mapping_error(i2c->dev, dma_dst_addr);
++ if (status) {
++ dev_err(i2c->dev, "DMA mapping failed\n");
++ goto out;
++ }
++
++ status = bsp_i2c_do_dma_write(i2c, dma_dst_addr);
++ dma_unmap_single(i2c->dev, dma_dst_addr, msg->len, DMA_TO_DEVICE);
++ mb();
++ }
++
++out:
++ released_contiguous_buf_from_list(i2c->msg);
++ if (!status) {
++ status = bsp_i2c_wait_idle(i2c);
++ bsp_i2c_disable(i2c);
++ }
++
++ return status;
++}
++
++static int bsp_i2c_dma_xfer_one_msg_mul_reg(struct bsp_i2c_dev *i2c,
++ unsigned int reg_data_width)
++{
++ unsigned int status;
++ struct i2c_msg *msg = i2c->msg;
++ dma_addr_t dma_dst_addr;
++
++ dev_dbg(i2c->dev, "[%s,%d]msg->flags=0x%x, len=0x%x\n",
++ __func__, __LINE__, msg->flags, msg->len);
++
++ if (copy_to_continuous_mem(i2c))
++ return -EINVAL;
++
++ if (msg->flags & I2C_M_RD) {
++ debug_dump_i2c_msg(i2c->msg);
++ mb();
++ dma_dst_addr = dma_map_single(i2c->dev, msg->buf,
++ msg->len, DMA_FROM_DEVICE);
++ status = dma_mapping_error(i2c->dev, dma_dst_addr);
++ if (status) {
++ dev_err(i2c->dev, "DMA mapping failed\n");
++ goto out;
++ }
++
++ status = bsp_i2c_do_dma_read(i2c, dma_dst_addr);
++
++ dma_unmap_single(i2c->dev, dma_dst_addr, msg->len, DMA_FROM_DEVICE);
++ mb();
++ } else {
++ mb();
++ dma_dst_addr = dma_map_single(i2c->dev, msg->buf,
++ msg->len, DMA_TO_DEVICE);
++ status = dma_mapping_error(i2c->dev, dma_dst_addr);
++ if (status) {
++ dev_err(i2c->dev, "DMA mapping failed\n");
++ goto out;
++ }
++
++ status = bsp_i2c_do_dma_write_mul_reg(i2c, dma_dst_addr, reg_data_width);
++ dma_unmap_single(i2c->dev, dma_dst_addr, msg->len, DMA_TO_DEVICE);
++ mb();
++ debug_dump_i2c_msg(i2c->msg);
++ }
++
++out:
++ released_contiguous_buf_from_list(i2c->msg);
++ return status;
++}
++#endif
++static int bsp_i2c_polling_xfer_one_msg(struct bsp_i2c_dev *i2c)
++{
++ int status;
++ unsigned int val;
++ struct i2c_msg *msg = i2c->msg;
++
++ dev_dbg(i2c->dev, "[%s,%d]msg->flags=0x%x, len=0x%x\n",
++ __func__, __LINE__, msg->flags, msg->len);
++
++ check_i2c_send_complete(i2c);
++ bsp_i2c_enable(i2c);
++ bsp_i2c_clr_irq(i2c);
++ bsp_i2c_set_addr(i2c);
++ bsp_i2c_cfg_cmd(i2c);
++ bsp_i2c_start_cmd(i2c);
++
++ i2c->msg_buf_ptr = 0;
++
++ if (msg->flags & I2C_M_RD) {
++ while (i2c->msg_buf_ptr < msg->len) {
++ status = bsp_i2c_wait_rx_noempty(i2c);
++ if (status)
++ goto end;
++
++ val = readl(i2c->base + BSP_I2C_RXF);
++ msg->buf[i2c->msg_buf_ptr] = val;
++ i2c->msg_buf_ptr++;
++ }
++ } else {
++ while (i2c->msg_buf_ptr < msg->len) {
++ status = bsp_i2c_wait_tx_nofull(i2c);
++ if (status)
++ goto end;
++
++ val = msg->buf[i2c->msg_buf_ptr];
++ writel(val, i2c->base + BSP_I2C_TXF);
++ i2c->msg_buf_ptr++;
++ }
++ }
++
++ status = bsp_i2c_wait_idle(i2c);
++end:
++ bsp_i2c_disable(i2c);
++
++ return status;
++}
++
++static int bsp_i2c_polling_xfer_one_msg_mul_reg(struct bsp_i2c_dev *i2c,
++ unsigned int reg_data_width)
++{
++ int status;
++ unsigned int val;
++ struct i2c_msg *msg = i2c->msg;
++
++ dev_dbg(i2c->dev, "[%s,%d]msg->flags=0x%x, len=0x%x\n",
++ __func__, __LINE__, msg->flags, msg->len);
++
++ check_i2c_send_complete(i2c);
++ bsp_i2c_enable(i2c);
++ bsp_i2c_clr_irq(i2c);
++ bsp_i2c_set_addr(i2c);
++ bsp_i2c_cfg_cmd_mul_reg(i2c, reg_data_width);
++ bsp_i2c_start_cmd(i2c);
++
++ i2c->msg_buf_ptr = 0;
++
++ if (msg->flags & I2C_M_RD) {
++ while (i2c->msg_buf_ptr < msg->len) {
++ status = bsp_i2c_wait_rx_noempty(i2c);
++ if (status)
++ goto end;
++
++ val = readl(i2c->base + BSP_I2C_RXF);
++ msg->buf[i2c->msg_buf_ptr] = val;
++ i2c->msg_buf_ptr++;
++
++ }
++ } else {
++ while (i2c->msg_buf_ptr < msg->len) {
++ status = bsp_i2c_wait_tx_nofull(i2c);
++ if (status)
++ goto end;
++
++ val = msg->buf[i2c->msg_buf_ptr];
++ writel(val, i2c->base + BSP_I2C_TXF);
++ i2c->msg_buf_ptr++;
++ }
++ }
++
++end:
++ return status;
++}
++
++static irqreturn_t bsp_i2c_isr(int irq, void *dev_id)
++{
++ struct bsp_i2c_dev *i2c = dev_id;
++ unsigned int irq_status;
++ struct i2c_msg *msg = i2c->msg;
++
++ spin_lock(&i2c->lock);
++
++ irq_status = bsp_i2c_clr_irq(i2c);
++ dev_dbg(i2c->dev, "%s RIS: 0x%x\n", __func__, irq_status);
++
++ if (!irq_status) {
++ dev_dbg(i2c->dev, "no irq\n");
++ goto end;
++ }
++
++ if (irq_status & INTR_ABORT_MASK) {
++ dev_err(i2c->dev, "irq handle abort, RIS: 0x%x\n",
++ irq_status);
++ i2c->status = -EIO;
++ bsp_i2c_disable_irq(i2c, INTR_ALL_MASK);
++
++ complete(&i2c->msg_complete);
++ goto end;
++ }
++
++ if (msg->flags & I2C_M_RD) {
++ while ((readl(i2c->base + BSP_I2C_STAT) & STAT_RXF_NOE_MASK)
++ && (i2c->msg_buf_ptr < msg->len)) {
++ msg->buf[i2c->msg_buf_ptr] =
++ readl(i2c->base + BSP_I2C_RXF);
++ i2c->msg_buf_ptr++;
++ }
++ } else {
++ while ((readl(i2c->base + BSP_I2C_STAT) & STAT_TXF_NOF_MASK)
++ && (i2c->msg_buf_ptr < msg->len)) {
++ writel(msg->buf[i2c->msg_buf_ptr],
++ i2c->base + BSP_I2C_TXF);
++ i2c->msg_buf_ptr++;
++ }
++ }
++
++ if (i2c->msg_buf_ptr >= msg->len)
++ bsp_i2c_disable_irq(i2c, INTR_TX_MASK | INTR_RX_MASK);
++
++ if (irq_status & INTR_CMD_DONE_MASK) {
++ dev_dbg(i2c->dev, "cmd done\n");
++ i2c->status = 0;
++ bsp_i2c_disable_irq(i2c, INTR_ALL_MASK);
++
++ complete(&i2c->msg_complete);
++ }
++
++end:
++ spin_unlock(&i2c->lock);
++
++ return IRQ_HANDLED;
++}
++
++static int bsp_i2c_interrupt_xfer_one_msg(struct bsp_i2c_dev *i2c)
++{
++ int status;
++ struct i2c_msg *msg = i2c->msg;
++ unsigned long timeout;
++ unsigned long flags;
++
++ dev_dbg(i2c->dev, "[%s,%d]msg->flags=0x%x, len=0x%x\n",
++ __func__, __LINE__, msg->flags, msg->len);
++
++ reinit_completion(&i2c->msg_complete);
++ i2c->msg_buf_ptr = 0;
++ i2c->status = -EIO;
++
++ spin_lock_irqsave(&i2c->lock, flags);
++ check_i2c_send_complete(i2c);
++ bsp_i2c_enable(i2c);
++ bsp_i2c_clr_irq(i2c);
++ if (msg->flags & I2C_M_RD)
++ bsp_i2c_cfg_irq(i2c, INTR_USE_MASK & ~INTR_TX_MASK);
++ else
++ bsp_i2c_cfg_irq(i2c, INTR_USE_MASK & ~INTR_RX_MASK);
++
++ bsp_i2c_set_addr(i2c);
++ bsp_i2c_cfg_cmd(i2c);
++ bsp_i2c_start_cmd(i2c);
++ spin_unlock_irqrestore(&i2c->lock, flags);
++
++ timeout = wait_for_completion_timeout(&i2c->msg_complete,
++ I2C_IRQ_TIMEOUT);
++
++ spin_lock_irqsave(&i2c->lock, flags);
++ if (timeout == 0) {
++ bsp_i2c_disable_irq(i2c, INTR_ALL_MASK);
++ status = -EIO;
++ dev_err(i2c->dev, "%s timeout\n",
++ msg->flags & I2C_M_RD ? "rx" : "tx");
++ } else {
++ status = i2c->status;
++ }
++
++ bsp_i2c_disable(i2c);
++
++ spin_unlock_irqrestore(&i2c->lock, flags);
++ return status;
++}
++
++/*
++ * Master transfer function
++ */
++static int bsp_i2c_xfer(struct i2c_adapter *adap,
++ struct i2c_msg *msgs, int num)
++{
++ struct bsp_i2c_dev *i2c = i2c_get_adapdata(adap);
++ int status = -EINVAL;
++ unsigned long flags;
++
++ if (msgs == NULL || (num <= 0)) {
++ dev_err(i2c->dev, "msgs == NULL || num <= 0, Invalid argument!\n");
++ return -EINVAL;
++ }
++
++ spin_lock_irqsave(&i2c->lock, flags);
++
++ i2c->msg = msgs;
++ i2c->msg_num = num;
++ i2c->msg_idx = 0;
++
++ while (i2c->msg_idx < i2c->msg_num) {
++#if defined(CONFIG_EDMAC)
++ if ((i2c->msg->len >= CONFIG_DMA_MSG_MIN_LEN) &&
++ (i2c->msg->len <= CONFIG_DMA_MSG_MAX_LEN)) {
++ status = bsp_i2c_dma_xfer_one_msg(i2c);
++ if (status)
++ break;
++ } else if (i2c->irq >= 0) {
++#else
++ if (i2c->irq >= 0) {
++#endif
++ spin_unlock_irqrestore(&i2c->lock, flags);
++ status = bsp_i2c_interrupt_xfer_one_msg(i2c);
++ spin_lock_irqsave(&i2c->lock, flags);
++ if (status)
++ break;
++ } else {
++ status = bsp_i2c_polling_xfer_one_msg(i2c);
++ if (status)
++ break;
++ }
++ i2c->msg++;
++ i2c->msg_idx++;
++ }
++
++ if (!status || i2c->msg_idx > 0)
++ status = i2c->msg_idx;
++
++ spin_unlock_irqrestore(&i2c->lock, flags);
++ return status;
++}
++
++/* bsp_i2c_break_polling_xfer
++ *
++ * I2c polling independent branch, Shielding interrupt interface
++ */
++static int bsp_i2c_break_polling_xfer(const struct i2c_adapter *adap,
++ struct i2c_msg *msgs, int num)
++{
++ struct bsp_i2c_dev *i2c = i2c_get_adapdata(adap);
++ int status = -EINVAL;
++ unsigned long flags;
++ if (msgs == NULL || (num <= 0)) {
++ dev_err(i2c->dev, "msgs == NULL || num <= 0, Invalid argument!\n");
++ return -EINVAL;
++ }
++ spin_lock_irqsave(&i2c->lock, flags);
++ i2c->msg = msgs;
++ i2c->msg_num = num;
++ i2c->msg_idx = 0;
++ while (i2c->msg_idx < i2c->msg_num) {
++#if defined(CONFIG_EDMAC)
++ debug_dump_i2c_msg(msgs);
++
++ if ((i2c->msg->len >= CONFIG_DMA_MSG_MIN_LEN) &&
++ (i2c->msg->len <= CONFIG_DMA_MSG_MAX_LEN)) {
++ status = bsp_i2c_dma_xfer_one_msg(i2c);
++ if (status)
++ break;
++ }
++#else
++ status = bsp_i2c_polling_xfer_one_msg(i2c);
++ if (status)
++ break;
++#endif
++ i2c->msg++;
++ i2c->msg_idx++;
++ }
++ if (!status || i2c->msg_idx > 0)
++ status = i2c->msg_idx;
++ spin_unlock_irqrestore(&i2c->lock, flags);
++ return status;
++}
++
++static int bsp_i2c_mul_reg_xfer(struct i2c_adapter* const adap,
++ struct i2c_msg *msgs, int num, unsigned int reg_data_width)
++{
++ struct bsp_i2c_dev *i2c = i2c_get_adapdata(adap);
++ int status = -EINVAL;
++ unsigned long flags;
++ if (msgs == NULL || (num <= 0)) {
++ dev_err(i2c->dev, "msgs == NULL || num <= 0, Invalid argument!\n");
++ return -EINVAL;
++ }
++ spin_lock_irqsave(&i2c->lock, flags);
++ i2c->msg = msgs;
++ i2c->msg_num = num;
++ i2c->msg_idx = 0;
++ while (i2c->msg_idx < i2c->msg_num) {
++ if ((i2c->msg->len >= CONFIG_DMA_MSG_MIN_LEN) &&
++ (i2c->msg->len <= CONFIG_DMA_MSG_MAX_LEN) && (i2c->msg->flags & I2C_M_DMA)) {
++#if defined(CONFIG_EDMAC) && defined(CONFIG_EDMAC_INTERRUPT)
++ status = bsp_i2c_dma_xfer_one_msg_mul_reg(i2c, reg_data_width);
++#endif
++ if (status)
++ break;
++ } else {
++ status = bsp_i2c_polling_xfer_one_msg_mul_reg(i2c, reg_data_width);
++ if (status)
++ break;
++ }
++ i2c->msg++;
++ i2c->msg_idx++;
++ }
++ if (!status || i2c->msg_idx > 0)
++ status = i2c->msg_idx;
++
++ spin_unlock_irqrestore(&i2c->lock, flags);
++ return status;
++}
++/* I2C READ *
++ * bsp_i2c_master_recv - issue a single I2C message in master receive mode
++ * @client: Handle to slave device
++ * @buf: Where to store data read from slave
++ * @count: How many bytes to read, must be less than 64k since msg.len is u16
++ *
++ * Returns negative errno, or else the number of bytes read.
++ */
++int bsp_i2c_master_recv(const struct i2c_client* const client, char* const buf,
++ int count)
++{
++ printk("Wrong interface call"
++ "bsp_i2c_transfer is the only interface to i2c read!!!\n");
++
++ return -EIO;
++}
++EXPORT_SYMBOL(bsp_i2c_master_recv);
++
++/* I2C WRITE *
++ * bsp_i2c_master_send - issue a single I2C message in master transmit mode
++ * @client: Handle to slave device
++ * @buf: Data that will be written to the slave
++ * @count: How many bytes to write, must be less than 64k since msg.len is u16
++ *
++ * Returns negative errno, or else the number of bytes written.
++ */
++int bsp_i2c_master_send(const struct i2c_client *client,
++ const char *buf, int count)
++{
++ struct i2c_adapter *adap = NULL;
++ struct i2c_msg msg;
++ int msgs_count;
++
++ if ((client == NULL) || (buf == NULL) || (client->adapter == NULL) ||
++ (count < 0)) {
++ printk(KERN_ERR "invalid args\n");
++ return -EINVAL;
++ }
++
++ if ((client->addr > 0x3ff) ||
++ (((client->flags & I2C_M_TEN) == 0) && (client->addr > 0x7f))) {
++ printk(KERN_ERR "dev address out of range\n");
++ return -EINVAL;
++ }
++
++ adap = client->adapter;
++ msg.addr = client->addr;
++ msg.flags = client->flags;
++ msg.len = count;
++
++ msg.buf = (__u8 *)buf;
++
++ debug_dump_i2c_msg(&msg);
++
++ msgs_count = bsp_i2c_break_polling_xfer(adap, &msg, 1);
++
++ return (msgs_count == 1) ? count : -EIO;
++}
++EXPORT_SYMBOL(bsp_i2c_master_send);
++
++
++int bsp_i2c_master_send_mul_reg(const struct i2c_client *client,
++ const char *buf, unsigned int count, unsigned int reg_data_width)
++{
++ struct i2c_adapter *adap = client->adapter;
++ struct i2c_msg msg;
++ int msgs_count;
++
++ if ((client->addr > 0x3ff)
++ || (((client->flags & I2C_M_TEN) == 0) && (client->addr > 0x7f))) {
++ printk(KERN_ERR "dev address out of range\n");
++ return -EINVAL;
++ }
++
++ msg.addr = client->addr;
++ msg.flags = client->flags;
++ msg.len = count;
++
++ if ((!buf) || (count < 0)) {
++ printk(KERN_ERR "buf == NULL || count < 0, Invalid argument!\n");
++ return -EINVAL;
++ }
++ msg.buf = (__u8 *)buf;
++
++ msgs_count = bsp_i2c_mul_reg_xfer(adap, &msg, 1,reg_data_width);
++
++ return (msgs_count == 1) ? count : -EIO;
++}
++EXPORT_SYMBOL(bsp_i2c_master_send_mul_reg);
++/**
++ * bsp_i2c_transfer - execute a single or combined I2C message
++ * @adap: Handle to I2C bus
++ * @msgs: One or more messages to execute before STOP is issued to
++ * terminate the operation; each message begins with a START.
++ * @num: Number of messages to be executed.
++ *
++ * Returns negative errno, else the number of messages executed.
++ *
++ * Note that there is no requirement that each message be sent to
++ * the same slave address, although that is the most common model.
++ */
++int bsp_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
++ int num)
++{
++ int msgs_count;
++
++ if ((!adap) || (!msgs)) {
++ printk(KERN_ERR "adap == NULL || msgs == NULL, Invalid argument!\n");
++ return -EINVAL;
++ }
++
++ if ((msgs[0].addr > 0x3ff) ||
++ (((msgs[0].flags & I2C_M_TEN) == 0) && (msgs[0].addr > 0x7f))) {
++ printk(KERN_ERR "msgs[0] dev address out of range\n");
++ return -EINVAL;
++ }
++
++ if ((msgs[1].addr > 0x3ff) ||
++ (((msgs[1].flags & I2C_M_TEN) == 0) && (msgs[1].addr > 0x7f))) {
++ printk(KERN_ERR "msgs[1] dev address out of range\n");
++ return -EINVAL;
++ }
++
++ msgs_count = bsp_i2c_xfer(adap, msgs, num);
++
++ return msgs_count;
++}
++EXPORT_SYMBOL(bsp_i2c_transfer);
++
++static u32 bsp_i2c_func(struct i2c_adapter *adap)
++{
++ return I2C_FUNC_I2C | I2C_FUNC_10BIT_ADDR |
++ I2C_FUNC_PROTOCOL_MANGLING |
++ I2C_FUNC_SMBUS_WORD_DATA |
++ I2C_FUNC_SMBUS_BYTE_DATA |
++ I2C_FUNC_SMBUS_BYTE |
++ I2C_FUNC_SMBUS_I2C_BLOCK;
++}
++
++static const struct i2c_algorithm bsp_i2c_algo = {
++ .master_xfer = bsp_i2c_xfer,
++ .functionality = bsp_i2c_func,
++};
++
++static int bsp_i2c_init_adap(struct i2c_adapter* const adap, struct bsp_i2c_dev* const i2c,
++ struct platform_device* const pdev)
++{
++ int status;
++
++ i2c_set_adapdata(adap, i2c);
++ adap->owner = THIS_MODULE;
++ strlcpy(adap->name, "bsp-i2c", sizeof(adap->name));
++ adap->dev.parent = &pdev->dev;
++ adap->dev.of_node = pdev->dev.of_node;
++ adap->algo = &bsp_i2c_algo;
++
++ /* Add the i2c adapter */
++ status = i2c_add_adapter(adap);
++ if (status)
++ dev_err(i2c->dev, "failed to add bus to i2c core\n");
++
++ return status;
++}
++
++static void try_deassert_i2c_reset(const struct bsp_i2c_dev *i2c)
++{
++ struct reset_control *i2c_rst = NULL;
++
++ i2c_rst = devm_reset_control_get(i2c->dev, "i2c_reset");
++ if (IS_ERR_OR_NULL(i2c_rst))
++ return;
++
++ /* deassert reset if "resets" property is set */
++ dev_info(i2c->dev, "deassert reset\n");
++ reset_control_deassert(i2c_rst);
++}
++
++static int bsp_i2c_probe(struct platform_device *pdev)
++{
++ int status;
++ struct bsp_i2c_dev *i2c;
++ struct i2c_adapter *adap = NULL;
++ struct resource *res = NULL;
++
++ i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL);
++ if (i2c == NULL)
++ return -ENOMEM;
++
++ platform_set_drvdata(pdev, i2c);
++ i2c->dev = &pdev->dev;
++ spin_lock_init(&i2c->lock);
++ init_completion(&i2c->msg_complete);
++
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (res == NULL) {
++ dev_err(i2c->dev, "Invalid mem resource./n");
++ return -ENODEV;
++ }
++
++ i2c->phybase = res->start;
++ i2c->base = devm_ioremap_resource(&pdev->dev, res);
++ if (IS_ERR(i2c->base)) {
++ dev_err(i2c->dev, "cannot ioremap resource\n");
++ return -ENOMEM;
++ }
++
++ i2c->clk = devm_clk_get(&pdev->dev, NULL);
++ if (IS_ERR(i2c->clk)) {
++ dev_err(i2c->dev, "cannot get clock\n");
++ return -ENOENT;
++ }
++ clk_prepare_enable(i2c->clk);
++
++ try_deassert_i2c_reset(i2c);
++
++ if (of_property_read_u32(pdev->dev.of_node, "clock-frequency", &i2c->freq)) {
++ dev_warn(i2c->dev, "setting default clock-frequency@%dHz\n", I2C_DEFAULT_FREQUENCY);
++ i2c->freq = I2C_DEFAULT_FREQUENCY;
++ }
++
++ /* i2c controller initialization, disable interrupt */
++ bsp_i2c_hw_init(i2c);
++
++ i2c->irq = platform_get_irq(pdev, 0);
++ status = devm_request_irq(&pdev->dev, i2c->irq, bsp_i2c_isr,
++ IRQF_SHARED, dev_name(&pdev->dev), i2c);
++ if (status) {
++ dev_dbg(i2c->dev, "falling back to polling mode");
++ i2c->irq = -1;
++ }
++
++ adap = &i2c->adap;
++ status = bsp_i2c_init_adap(adap, i2c, pdev);
++ if (status)
++ clk_disable_unprepare(i2c->clk);
++
++ return status;
++}
++
++static int bsp_i2c_remove(struct platform_device *pdev)
++{
++ struct bsp_i2c_dev *i2c = platform_get_drvdata(pdev);
++
++ clk_disable_unprepare(i2c->clk);
++ i2c_del_adapter(&i2c->adap);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM_SLEEP
++static int bsp_i2c_suspend(struct device *dev)
++{
++ struct bsp_i2c_dev *i2c = dev_get_drvdata(dev);
++
++ i2c_lock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER);
++ clk_disable_unprepare(i2c->clk);
++ i2c_unlock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER);
++
++ return 0;
++}
++
++static int bsp_i2c_resume(struct device *dev)
++{
++ struct bsp_i2c_dev *i2c = dev_get_drvdata(dev);
++
++ i2c_lock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER);
++ clk_prepare_enable(i2c->clk);
++ bsp_i2c_hw_init(i2c);
++ i2c_unlock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER);
++
++ return 0;
++}
++#endif
++
++static SIMPLE_DEV_PM_OPS(bsp_i2c_dev_pm, bsp_i2c_suspend,
++ bsp_i2c_resume);
++
++static const struct of_device_id bsp_i2c_match[] = {
++ { .compatible = "vendor,i2c" },
++ {},
++};
++MODULE_DEVICE_TABLE(of, bsp_i2c_match);
++
++static struct platform_driver bsp_i2c_driver = {
++ .driver = {
++ .name = "bsp-i2c",
++ .of_match_table = bsp_i2c_match,
++ .pm = &bsp_i2c_dev_pm,
++ },
++ .probe = bsp_i2c_probe,
++ .remove = bsp_i2c_remove,
++};
++
++module_platform_driver(bsp_i2c_driver);
++
++MODULE_DESCRIPTION("I2C Bus driver");
++MODULE_LICENSE("GPL v2");
+diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c
+index dafad891998e..39ce670c2a15 100644
+--- a/drivers/i2c/i2c-dev.c
++++ b/drivers/i2c/i2c-dev.c
+@@ -233,6 +233,43 @@ static int i2cdev_check_addr(struct i2c_adapter *adapter, unsigned int addr)
+ return result;
+ }
+
++static noinline int i2c_config_mul_reg(struct i2c_client *client, unsigned long arg)
++{
++ struct i2c_msg msg;
++ unsigned int reg_width;
++ unsigned int data_width;
++ unsigned int reg_data_width;
++
++ if (copy_from_user(&msg,
++ (struct i2c_msg __user *)arg,
++ sizeof(msg)))
++ return -EFAULT;
++
++ if(client->flags & I2C_M_16BIT_REG)
++ reg_width = 2;
++ else
++ reg_width = 1;
++
++ if(client->flags & I2C_M_16BIT_DATA)
++ data_width = 2;
++ else
++ data_width = 1;
++
++ reg_data_width = reg_width + data_width;
++
++ msg.buf = memdup_user(msg.buf,msg.len);
++
++ if(msg.len == 0 || reg_data_width > msg.len || msg.len % reg_data_width != 0){
++ printk(KERN_ERR "msg.len err!!!\n");
++ return -EINVAL;
++ }
++
++ bsp_i2c_master_send_mul_reg(client, msg.buf, msg.len, reg_data_width);
++
++ return 0;
++
++}
++
+ static noinline int i2cdev_ioctl_rdwr(struct i2c_client *client,
+ unsigned nmsgs, struct i2c_msg *msgs)
+ {
+@@ -485,6 +522,24 @@ static long i2cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+ */
+ client->adapter->timeout = msecs_to_jiffies(arg * 10);
+ break;
++ case I2C_CONFIG_FLAGS:
++ if (arg & I2C_M_16BIT_REG)
++ client->flags |= I2C_M_16BIT_REG;
++ else
++ client->flags &= ~I2C_M_16BIT_REG;
++
++ if (arg & I2C_M_16BIT_DATA)
++ client->flags |= I2C_M_16BIT_DATA;
++ else
++ client->flags &= ~I2C_M_16BIT_DATA;
++
++ if (arg & I2C_M_DMA)
++ client->flags |= I2C_M_DMA;
++ else
++ client->flags &= ~I2C_M_DMA;
++ return 0;
++ case I2C_CONFIG_MUL_REG:
++ return i2c_config_mul_reg(client, arg);
+ default:
+ /* NOTE: returning a fault code here could cause trouble
+ * in buggy userspace code. Some old kernel bugs returned
+diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
+index e39b679126a2..a72d2d224669 100644
+--- a/drivers/iio/adc/Kconfig
++++ b/drivers/iio/adc/Kconfig
+@@ -468,6 +468,16 @@ config HI8435
+ This driver can also be built as a module. If so, the module will be
+ called hi8435.
+
++config VENDOR_LSADC
++ tristate "VENDOR LSADC driver"
++ depends on ARCH_BSP || COMPILE_TEST
++ help
++ Say yes here to build support for the LSADC found in SoCs from
++ vendor chip.
++
++ To compile this driver as a module, choose M here: the
++ module will be called vendor_lsadc.
++
+ config HX711
+ tristate "AVIA HX711 ADC for weight cells"
+ depends on GPIOLIB
+diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
+index 90f94ada7b30..8375619f83bc 100644
+--- a/drivers/iio/adc/Makefile
++++ b/drivers/iio/adc/Makefile
+@@ -44,6 +44,7 @@ obj-$(CONFIG_EP93XX_ADC) += ep93xx_adc.o
+ obj-$(CONFIG_EXYNOS_ADC) += exynos_adc.o
+ obj-$(CONFIG_FSL_MX25_ADC) += fsl-imx25-gcq.o
+ obj-$(CONFIG_HI8435) += hi8435.o
++obj-$(CONFIG_VENDOR_LSADC) += bsp_lsadc.o
+ obj-$(CONFIG_HX711) += hx711.o
+ obj-$(CONFIG_IMX7D_ADC) += imx7d_adc.o
+ obj-$(CONFIG_INA2XX_ADC) += ina2xx-adc.o
+diff --git a/drivers/iio/adc/bsp_lsadc.c b/drivers/iio/adc/bsp_lsadc.c
+new file mode 100644
+index 000000000000..90fcfeb216eb
+--- /dev/null
++++ b/drivers/iio/adc/bsp_lsadc.c
+@@ -0,0 +1,473 @@
++/*
++ * Vendor Low Speed (LS) A/D Converter
++ * Copyright (C) 2020 Shenshu Technologies Co., Ltd.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ */
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++
++#define VENDOR_LSADC_CONFIG 0x00
++#define VENDOR_CONFIG_DEGLITCH BIT(17)
++#define VENDOR_CONFIG_RESET BIT(15)
++#define VENDOR_CONFIG_MODE BIT(13)
++#define VENDOR_CONFIG_EQU_MODE BIT(12)
++#define VENDOR_CONFIG_CHN3 BIT(11)
++#define VENDOR_CONFIG_CHN2 BIT(10)
++#define VENDOR_CONFIG_CHN1 BIT(9)
++#define VENDOR_CONFIG_CHN0 BIT(8)
++
++#define VENDOR_CONFIG_EQU_CHN3 BIT(3)
++#define VENDOR_CONFIG_EQU_CHN2 BIT(2)
++#define VENDOR_CONFIG_EQU_CHN1 BIT(1)
++#define VENDOR_CONFIG_EQU_CHN0 BIT(0)
++
++#define VENDOR_LSADC_TIMESCAN 0x08
++#define VENDOR_LSADC_INTEN 0x10
++#define VENDOR_LSADC_INTSTATUS 0x14
++#define VENDOR_LSADC_INTCLR 0x18
++#define VENDOR_LSADC_START 0x1C
++#define VENDOR_LSADC_STOP 0x20
++#define VENDOR_LSADC_ACTBIT 0x24
++#define VENDOR_LSADC_CHNDATA 0x2C
++#define VENDOR_LSADC_CHN_EQU_DATA 0x50
++
++#define VENDOR_LSADC_CON_EN (1u << 0)
++#define VENDOR_LSADC_CON_DEN (0u << 0)
++
++#define VENDOR_LSADC_NUM_BITS 10
++#define VENDOR_LSADC_CHN_MASK 0xF
++
++/* fix clk:3000000, default tscan set 10ms */
++#define VENDOR_LSADC_TSCAN_MS (10*3000)
++
++#define VENDOR_LSADC_TIMEOUT msecs_to_jiffies(100)
++
++/* default voltage scale for every channel */
++static int g_vendor_lsadc_voltage[] = {
++ 1800, 1800, 1800, 1800
++};
++
++struct vendor_lsadc {
++ void __iomem *regs;
++ struct clk *lsadc_clk;
++ int irq;
++ struct completion completion;
++ struct reset_control *reset;
++ const struct vendor_lsadc_data *data;
++ unsigned int cur_chn;
++ unsigned int value;
++ unsigned int average_value;
++};
++
++struct vendor_lsadc_data {
++ int num_bits;
++ const struct iio_chan_spec *channels;
++ int num_channels;
++
++ void (*clear_irq)(struct vendor_lsadc *info, int mask);
++ void (*start_conv)(struct vendor_lsadc *info);
++ void (*stop_conv)(struct vendor_lsadc *info);
++};
++
++static int vendor_lsadc_read_raw(struct iio_dev *indio_dev,
++ struct iio_chan_spec const *chan,
++ int *val, int *val2, long mask)
++{
++ struct vendor_lsadc *info = iio_priv(indio_dev);
++
++ switch (mask) {
++ case IIO_CHAN_INFO_RAW:
++ mutex_lock(&indio_dev->mlock);
++
++ reinit_completion(&info->completion);
++
++ /* Select the channel to be used */
++ info->cur_chn = chan->channel;
++
++ if (info->data->start_conv)
++ info->data->start_conv(info);
++
++ if (!wait_for_completion_timeout(&info->completion,
++ VENDOR_LSADC_TIMEOUT)) {
++ if (info->data->stop_conv)
++ info->data->stop_conv(info);
++ mutex_unlock(&indio_dev->mlock);
++ return -ETIMEDOUT;
++ }
++
++ *val = info->value;
++ mutex_unlock(&indio_dev->mlock);
++ return IIO_VAL_INT;
++ case IIO_CHAN_INFO_AVERAGE_RAW:
++ mutex_lock(&indio_dev->mlock);
++
++ reinit_completion(&info->completion);
++
++ /* Select the channel to be used */
++ info->cur_chn = chan->channel;
++
++ if (info->data->start_conv)
++ info->data->start_conv(info);
++
++ if (!wait_for_completion_timeout(&info->completion,
++ VENDOR_LSADC_TIMEOUT)) {
++ if (info->data->stop_conv)
++ info->data->stop_conv(info);
++ mutex_unlock(&indio_dev->mlock);
++ return -ETIMEDOUT;
++ }
++
++ *val = info->average_value;
++ mutex_unlock(&indio_dev->mlock);
++ return IIO_VAL_INT;
++ case IIO_CHAN_INFO_SCALE:
++ *val = g_vendor_lsadc_voltage[chan->channel];
++ *val2 = info->data->num_bits;
++ return IIO_VAL_FRACTIONAL_LOG2;
++ default:
++ return -EINVAL;
++ }
++}
++
++static irqreturn_t vendor_lsadc_isr(int irq, void *dev_id)
++{
++ struct vendor_lsadc *info = (struct vendor_lsadc *)dev_id;
++ int mask;
++
++ mask = readl(info->regs + VENDOR_LSADC_INTSTATUS);
++ if ((mask & VENDOR_LSADC_CHN_MASK) == 0)
++ return IRQ_NONE;
++
++ /* Clear irq */
++ mask &= VENDOR_LSADC_CHN_MASK;
++ if (info->data->clear_irq)
++ info->data->clear_irq(info, mask);
++
++ /* Read value */
++ info->value = readl(info->regs +
++ VENDOR_LSADC_CHNDATA + (info->cur_chn << 2)); /* 2: bit 2 */
++ info->value &= GENMASK(info->data->num_bits - 1, 0);
++
++ /* Read average value */
++ info->average_value = readl(info->regs +
++ VENDOR_LSADC_CHN_EQU_DATA + (info->cur_chn << 2)); /* 2: bit 2 */
++ info->average_value &= GENMASK(info->data->num_bits - 1, 0);
++
++ /* stop adc */
++ if (info->data->stop_conv)
++ info->data->stop_conv(info);
++
++ complete(&info->completion);
++
++ return IRQ_HANDLED;
++}
++
++static const struct iio_info vendor_lsadc_iio_info = {
++ .read_raw = vendor_lsadc_read_raw,
++};
++
++#define vendor_lsadc_channel(_index, _id) { \
++ .type = IIO_VOLTAGE, \
++ .indexed = 1, \
++ .channel = (_index), \
++ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
++ BIT(IIO_CHAN_INFO_SCALE) | \
++ BIT(IIO_CHAN_INFO_AVERAGE_RAW), \
++ .datasheet_name = (_id), \
++}
++
++static const struct iio_chan_spec vendor_lsadc_iio_channels[] = {
++ vendor_lsadc_channel(0, "adc0"),
++ vendor_lsadc_channel(1, "adc1"),
++ vendor_lsadc_channel(2, "adc2"),
++ vendor_lsadc_channel(3, "adc3"),
++};
++
++static void vendor_lsadc_clear_irq(struct vendor_lsadc *info, int mask)
++{
++ writel(mask, info->regs + VENDOR_LSADC_INTCLR);
++}
++
++static void vendor_lsadc_start_conv(struct vendor_lsadc *info)
++{
++ unsigned int con;
++
++ /* set number bit */
++ con = GENMASK(info->data->num_bits - 1, 0);
++ writel(con, (info->regs + VENDOR_LSADC_ACTBIT));
++
++ /* config */
++ con = readl(info->regs + VENDOR_LSADC_CONFIG);
++ con &= ~VENDOR_CONFIG_RESET; /* set to 0 */
++ con &= ~VENDOR_CONFIG_EQU_MODE; /* set to 0 */
++ con |= (VENDOR_CONFIG_DEGLITCH | VENDOR_CONFIG_MODE); /* set to 1 */
++ con &= ~(VENDOR_CONFIG_CHN0 | VENDOR_CONFIG_CHN1 |
++ VENDOR_CONFIG_CHN2 | VENDOR_CONFIG_CHN3 |
++ VENDOR_CONFIG_EQU_CHN0 | VENDOR_CONFIG_EQU_CHN1 |
++ VENDOR_CONFIG_EQU_CHN2 | VENDOR_CONFIG_EQU_CHN3); /* set to 0 */
++ con |= (VENDOR_CONFIG_CHN0 << info->cur_chn); /* set to 1 */
++ con |= (VENDOR_CONFIG_EQU_CHN0 << info->cur_chn); /* set to 1 */
++ writel(con, (info->regs + VENDOR_LSADC_CONFIG));
++
++ /* set timescan */
++ writel(VENDOR_LSADC_TSCAN_MS, (info->regs + VENDOR_LSADC_TIMESCAN));
++
++ /* clear interrupt */
++ writel(VENDOR_LSADC_CHN_MASK, info->regs + VENDOR_LSADC_INTCLR);
++
++ /* enable interrupt */
++ writel(VENDOR_LSADC_CON_EN, (info->regs + VENDOR_LSADC_INTEN));
++
++ /* start scan */
++ writel(VENDOR_LSADC_CON_EN, (info->regs + VENDOR_LSADC_START));
++}
++
++static void vendor_lsadc_stop_conv(struct vendor_lsadc *info)
++{
++ /* reset the timescan */
++ writel(VENDOR_LSADC_CON_DEN, (info->regs + VENDOR_LSADC_TIMESCAN));
++
++ /* disable interrupt */
++ writel(VENDOR_LSADC_CON_DEN, (info->regs + VENDOR_LSADC_INTEN));
++
++ /* stop scan */
++ writel(VENDOR_LSADC_CON_EN, (info->regs + VENDOR_LSADC_STOP));
++}
++
++static const struct vendor_lsadc_data lsadc_data = {
++ .num_bits = VENDOR_LSADC_NUM_BITS,
++ .channels = vendor_lsadc_iio_channels,
++ .num_channels = ARRAY_SIZE(vendor_lsadc_iio_channels),
++
++ .clear_irq = vendor_lsadc_clear_irq,
++ .start_conv = vendor_lsadc_start_conv,
++ .stop_conv = vendor_lsadc_stop_conv,
++};
++
++static const struct of_device_id vendor_lsadc_match[] = {
++ {
++ .compatible = "vendor,lsadc",
++ .data = &lsadc_data,
++ },
++ {},
++};
++MODULE_DEVICE_TABLE(of, vendor_lsadc_match);
++
++/* Reset LSADC Controller */
++static void vendor_lsadc_reset_controller(struct reset_control *reset)
++{
++ reset_control_assert(reset);
++ usleep_range(10, 20); /* 10, 20: us*/
++ reset_control_deassert(reset);
++}
++
++static int vendor_lsadc_device_alloc(struct platform_device *pdev, struct iio_dev **indio_dev)
++{
++ struct vendor_lsadc *info = NULL;
++ struct device_node *np = pdev->dev.of_node;
++
++ if (np == NULL)
++ return -ENODEV;
++
++ (*indio_dev) = devm_iio_device_alloc(&pdev->dev, sizeof(*info));
++ if ((*indio_dev) == NULL) {
++ dev_err(&pdev->dev, "failed allocating iio device\n");
++ return -ENOMEM;
++ }
++ return 0;
++}
++
++static void vendor_lsadc_device_free(struct platform_device *pdev, struct iio_dev *indio_dev)
++{
++ devm_iio_device_free(&pdev->dev, indio_dev);
++}
++
++static int vendor_lsadc_clk_prepare_enable(struct platform_device *pdev, struct iio_dev *indio_dev,
++ struct vendor_lsadc **info)
++{
++ struct resource *mem = NULL;
++ const struct of_device_id *match = NULL;
++ int ret;
++
++ *info = iio_priv(indio_dev);
++ (*info)->lsadc_clk = devm_clk_get(&pdev->dev, NULL);
++ if (IS_ERR((*info)->lsadc_clk)) {
++ dev_err(&pdev->dev, "getting clock failed with %ld\n",
++ PTR_ERR((*info)->lsadc_clk));
++ return PTR_ERR((*info)->lsadc_clk);
++ }
++
++ match = of_match_device(vendor_lsadc_match, &pdev->dev);
++ (*info)->data = match->data;
++
++ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ (*info)->regs = devm_ioremap_resource(&pdev->dev, mem);
++ if (IS_ERR((*info)->regs))
++ return PTR_ERR((*info)->regs);
++
++ ret = clk_prepare_enable((*info)->lsadc_clk);
++ if (ret < 0)
++ return ret;
++ return 0;
++}
++
++static void vendor_lsadc_clk_disable_unprepare(struct vendor_lsadc *info)
++{
++ clk_disable_unprepare(info->lsadc_clk);
++}
++
++static int vendor_lsadc_requst_irq(struct platform_device *pdev, struct vendor_lsadc *info)
++{
++ int ret;
++
++ /*
++ * The reset should be an optional property, as it should work
++ * with old devicetrees as well
++ */
++ info->reset = devm_reset_control_get(&pdev->dev, "lsadc-crg");
++ if (IS_ERR(info->reset)) {
++ ret = PTR_ERR(info->reset);
++ if (ret != -ENOENT)
++ return ret;
++
++ dev_dbg(&pdev->dev, "no reset control found\n");
++ info->reset = NULL;
++ }
++
++ init_completion(&info->completion);
++
++ info->irq = platform_get_irq(pdev, 0);
++ if (info->irq < 0) {
++ dev_err(&pdev->dev, "no irq resource?\n");
++ ret = info->irq;
++ return ret;
++ }
++
++ ret = devm_request_irq(&pdev->dev, info->irq, vendor_lsadc_isr,
++ IRQF_SHARED, dev_name(&pdev->dev), info);
++ if (ret < 0) {
++ dev_err(&pdev->dev, "failed requesting irq %d\n", info->irq);
++ return ret;
++ }
++
++ if (info->reset != NULL)
++ vendor_lsadc_reset_controller(info->reset);
++
++ return 0;
++}
++
++static void vendor_lsadc_free_irq(struct platform_device *pdev, struct vendor_lsadc *info)
++{
++ devm_free_irq(&pdev->dev, info->irq, info);
++}
++
++static int vendor_lsadc_device_register(struct platform_device *pdev, struct iio_dev *indio_dev,
++ struct vendor_lsadc *info)
++{
++ int ret;
++
++ platform_set_drvdata(pdev, indio_dev);
++
++ indio_dev->name = dev_name(&pdev->dev);
++ indio_dev->dev.parent = &pdev->dev;
++ indio_dev->dev.of_node = pdev->dev.of_node;
++ indio_dev->info = &vendor_lsadc_iio_info;
++ indio_dev->modes = INDIO_DIRECT_MODE;
++ indio_dev->driver_module = THIS_MODULE;
++
++ indio_dev->channels = info->data->channels;
++ indio_dev->num_channels = info->data->num_channels;
++
++ ret = devm_iio_device_register(&pdev->dev, indio_dev);
++ if (ret < 0) {
++ dev_err(&pdev->dev, "failed register iio device\n");
++ return ret;
++ }
++
++ return 0;
++}
++
++static int vendor_lsadc_probe(struct platform_device *pdev)
++{
++ struct vendor_lsadc *info = NULL;
++ struct iio_dev *indio_dev = NULL;
++ int ret;
++
++ ret = vendor_lsadc_device_alloc(pdev, &indio_dev);
++ if (ret != 0)
++ return ret;
++
++ ret = vendor_lsadc_clk_prepare_enable(pdev, indio_dev, &info);
++ if (ret != 0)
++ goto vendor_lsadc_out0;
++
++ ret = vendor_lsadc_requst_irq(pdev, info);
++ if (ret != 0)
++ goto vendor_lsadc_out1;
++
++ vendor_lsadc_device_register(pdev, indio_dev, info);
++ if (ret != 0)
++ goto vendor_lsadc_out2;
++
++ return 0;
++
++vendor_lsadc_out2:
++ vendor_lsadc_free_irq(pdev, info);
++vendor_lsadc_out1:
++ vendor_lsadc_clk_disable_unprepare(info);
++vendor_lsadc_out0:
++ vendor_lsadc_device_free(pdev, indio_dev);
++
++ return ret;
++}
++
++static int vendor_lsadc_remove(struct platform_device *pdev)
++{
++ struct vendor_lsadc *info = NULL;
++ struct iio_dev *indio_dev = NULL;
++
++ indio_dev = platform_get_drvdata(pdev);
++ info = iio_priv(indio_dev);
++
++ devm_iio_device_unregister(&pdev->dev, indio_dev);
++ devm_free_irq(&pdev->dev, info->irq, info);
++ clk_disable_unprepare(info->lsadc_clk);
++ devm_iio_device_free(&pdev->dev, indio_dev);
++
++ return 0;
++}
++
++static struct platform_driver vendor_lsadc_driver = {
++ .probe = vendor_lsadc_probe,
++ .remove = vendor_lsadc_remove,
++ .driver = {
++ .name = "vendor-lsadc",
++ .of_match_table = vendor_lsadc_match,
++ },
++};
++
++module_platform_driver(vendor_lsadc_driver);
++
++MODULE_AUTHOR("Vendor multimedia software group");
++MODULE_DESCRIPTION("Vendor multimedia software group lsadc driver");
++MODULE_LICENSE("GPL v2");
+diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
+index ea98aad9fb81..206505261eac 100644
+--- a/drivers/iio/industrialio-core.c
++++ b/drivers/iio/industrialio-core.c
+@@ -1843,6 +1843,54 @@ int __devm_iio_device_register(struct device *dev, struct iio_dev *indio_dev,
+ }
+ EXPORT_SYMBOL_GPL(__devm_iio_device_register);
+
++#ifdef CONFIG_ARCH_BSP
++
++int devm_iio_device_match(struct device *dev, void *res, void *data)
++{
++ struct iio_dev **r = res;
++ if (!r || !*r) {
++ WARN_ON(!r || !*r);
++ return 0;
++ }
++ return *r == data;
++}
++EXPORT_SYMBOL_GPL(devm_iio_device_match);
++
++/**
++ * devm_iio_device_free - Resource-managed iio_device_free()
++ * @dev: Device this iio_dev belongs to
++ * @iio_dev: the iio_dev associated with the device
++ *
++ * Free iio_dev allocated with devm_iio_device_alloc().
++ */
++void devm_iio_device_free(struct device *dev, struct iio_dev *iio_dev)
++{
++ int rc;
++
++ rc = devres_release(dev, devm_iio_device_release,
++ devm_iio_device_match, iio_dev);
++ WARN_ON(rc);
++}
++EXPORT_SYMBOL_GPL(devm_iio_device_free);
++
++/**
++ * devm_iio_device_unregister - Resource-managed iio_device_unregister()
++ * @dev: Device this iio_dev belongs to
++ * @indio_dev: the iio_dev associated with the device
++ *
++ * Unregister iio_dev registered with devm_iio_device_register().
++ */
++void devm_iio_device_unregister(struct device *dev, struct iio_dev *indio_dev)
++{
++ int rc;
++
++ rc = devres_release(dev, devm_iio_device_unreg,
++ devm_iio_device_match, indio_dev);
++ WARN_ON(rc);
++}
++EXPORT_SYMBOL_GPL(devm_iio_device_unregister);
++#endif
++
+ /**
+ * iio_device_claim_direct_mode - Keep device in direct mode
+ * @indio_dev: the iio_dev associated with the device
+diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig
+index b630e58c49b6..b01313108df2 100644
+--- a/drivers/iommu/Kconfig
++++ b/drivers/iommu/Kconfig
+@@ -58,6 +58,23 @@ config IOMMU_IO_PGTABLE_ARMV7S
+ 2-level tables with 4KB pages/1MB sections, and contiguous entries
+ for 64KB pages/16MB supersections if indicated by the IOMMU driver.
+
++menu "Generic PASID table support"
++
++config IOMMU_PASID_TABLE
++ bool
++
++config ARM_SMMU_V3_CONTEXT
++ bool "ARM SMMU v3 Context Descriptor tables"
++ select IOMMU_PASID_TABLE
++ depends on ARM64
++ help
++ Enable support for ARM SMMU v3 Context Descriptor tables, used for
++ DMA and PASID support.
++
++ If unsure, say N here.
++
++endmenu
++
+ config IOMMU_IO_PGTABLE_ARMV7S_SELFTEST
+ bool "ARMv7s selftests"
+ depends on IOMMU_IO_PGTABLE_ARMV7S
+@@ -103,10 +120,14 @@ config IOMMU_DMA
+ select IRQ_MSI_IOMMU
+ select NEED_SG_DMA_LENGTH
+
+-# Shared Virtual Addressing
+-config IOMMU_SVA
++# Shared Virtual Addressing library
++config IOMMU_SVA_LIB
++ bool
++ select IOASID
++
++config IOMMU_PAGE_FAULT
+ bool
+- select IOASID
++ select IOMMU_API
+
+ config FSL_PAMU
+ bool "Freescale IOMMU support"
+@@ -136,7 +157,6 @@ config MSM_IOMMU
+
+ source "drivers/iommu/amd/Kconfig"
+ source "drivers/iommu/intel/Kconfig"
+-source "drivers/iommu/sw64/Kconfig"
+
+ config IRQ_REMAP
+ bool "Support for Interrupt Remapping"
+@@ -304,9 +324,11 @@ config ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT
+ config ARM_SMMU_V3
+ tristate "ARM Ltd. System MMU Version 3 (SMMUv3) Support"
+ depends on ARM64
+- select IOASID
+ select IOMMU_API
++ select IOMMU_SVA
++ select IOMMU_PAGE_FAULT
+ select IOMMU_IO_PGTABLE_LPAE
++ select ARM_SMMU_V3_CONTEXT
+ select GENERIC_MSI_IRQ_DOMAIN
+ help
+ Support for implementations of the ARM System MMU architecture
+@@ -318,7 +340,7 @@ config ARM_SMMU_V3
+ config ARM_SMMU_V3_SVA
+ bool "Shared Virtual Addressing support for the ARM SMMUv3"
+ depends on ARM_SMMU_V3
+- select IOMMU_SVA
++ select IOMMU_SVA_LIB
+ select MMU_NOTIFIER
+ help
+ Support for sharing process address spaces with devices using the
+@@ -327,22 +349,6 @@ config ARM_SMMU_V3_SVA
+ Say Y here if your system supports SVA extensions such as PCIe PASID
+ and PRI.
+
+-config AGENT_SMMU_ATOS
+- bool "An implementation of ATOS feature support for the ARM SMMUv3"
+- depends on ARM_SMMU_V3
+- help
+- Support for ARM SMMUv3 ATOS feature which can translating IPA to PA.
+-
+- Say Y here if your system will be used in Ascend Advanced Accelerator
+- with HCCS bus. Or want use the ATOS of SMMU.
+-
+-config ARM_SMMU_V3_PM
+- bool "Add arm_smmu_v3 suspend and resume support"
+- depends on ARM_SMMU_V3 && PM_SLEEP
+- default n
+- help
+- Add support for suspend and resume support for arm smmu v3.
+-
+ config S390_IOMMU
+ def_bool y if S390 && PCI
+ depends on S390 && PCI
+@@ -426,26 +432,4 @@ config VIRTIO_IOMMU
+
+ Say Y here if you intend to run this kernel as a guest.
+
+-config SMMU_BYPASS_DEV
+- bool "SMMU bypass streams for some specific devices"
+- depends on ARM_SMMU_V3=y
+- help
+- Using the smmu.bypassdev cmdline, to collect the devices that SMMU
+- performs attribute transformation only, with no address translation.
+- E.g:SMMU allow iMR3408/3416 Raid bypass at DMA default domain to
+- support other devices to use virtualization such as VFIO.
+-
+- This feature will be replaced by ACPI IORT RMR node, which will be
+- upstreamed in mainline.
+-
+ endif # IOMMU_SUPPORT
+-
+-config IOVA_MAX_GLOBAL_MAGS
+- int "Set the max iova global magzines in iova rcache"
+- range 16 2048
+- default "32"
+- help
+- Iova rcache global magizine is shared among every cpu. The size of
+- it can be a bottle neck when lots of cpus are contending to use it.
+- If you are suffering from the speed of allocing iova with more than
+- 128 cpus, try to tune this config larger.
+diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile
+index ae38d815537e..60fafc23dee6 100644
+--- a/drivers/iommu/Makefile
++++ b/drivers/iommu/Makefile
+@@ -1,5 +1,5 @@
+ # SPDX-License-Identifier: GPL-2.0
+-obj-y += amd/ intel/ arm/ sw64/
++obj-y += amd/ intel/ arm/
+ obj-$(CONFIG_IOMMU_API) += iommu.o
+ obj-$(CONFIG_IOMMU_API) += iommu-traces.o
+ obj-$(CONFIG_IOMMU_API) += iommu-sysfs.o
+@@ -27,4 +27,5 @@ obj-$(CONFIG_FSL_PAMU) += fsl_pamu.o fsl_pamu_domain.o
+ obj-$(CONFIG_S390_IOMMU) += s390-iommu.o
+ obj-$(CONFIG_HYPERV_IOMMU) += hyperv-iommu.o
+ obj-$(CONFIG_VIRTIO_IOMMU) += virtio-iommu.o
+-obj-$(CONFIG_IOMMU_SVA) += iommu-sva-lib.o io-pgfault.o
++obj-$(CONFIG_IOMMU_SVA_LIB) += iommu-sva-lib.o
++obj-$(CONFIG_IOMMU_SVA_LIB) += io-pgfault.o
+diff --git a/drivers/iommu/amd/amd_iommu.h b/drivers/iommu/amd/amd_iommu.h
+index 0c40d22409f2..b4adab698563 100644
+--- a/drivers/iommu/amd/amd_iommu.h
++++ b/drivers/iommu/amd/amd_iommu.h
+@@ -17,7 +17,6 @@ extern int amd_iommu_init_passthrough(void);
+ extern irqreturn_t amd_iommu_int_thread(int irq, void *data);
+ extern irqreturn_t amd_iommu_int_handler(int irq, void *data);
+ extern void amd_iommu_apply_erratum_63(u16 devid);
+-extern void amd_iommu_restart_event_logging(struct amd_iommu *iommu);
+ extern void amd_iommu_reset_cmd_buffer(struct amd_iommu *iommu);
+ extern int amd_iommu_init_devices(void);
+ extern void amd_iommu_uninit_devices(void);
+diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
+index 690c5976575c..33446c9d3bac 100644
+--- a/drivers/iommu/amd/amd_iommu_types.h
++++ b/drivers/iommu/amd/amd_iommu_types.h
+@@ -109,7 +109,6 @@
+ #define PASID_MASK 0x0000ffff
+
+ /* MMIO status bits */
+-#define MMIO_STATUS_EVT_OVERFLOW_INT_MASK (1 << 0)
+ #define MMIO_STATUS_EVT_INT_MASK (1 << 1)
+ #define MMIO_STATUS_COM_WAIT_INT_MASK (1 << 2)
+ #define MMIO_STATUS_PPR_INT_MASK (1 << 6)
+diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
+index ce822347f747..cc9869cc48e4 100644
+--- a/drivers/iommu/amd/init.c
++++ b/drivers/iommu/amd/init.c
+@@ -20,7 +20,6 @@
+ #include
+ #include
+ #include
+-#include
+ #include
+ #include
+ #include
+@@ -84,11 +83,7 @@
+ #define ACPI_DEVFLAG_LINT1 0x80
+ #define ACPI_DEVFLAG_ATSDIS 0x10000000
+
+-#define LOOP_TIMEOUT 2000000
+-
+-#define IVRS_GET_SBDF_ID(seg, bus, dev, fd) (((seg & 0xffff) << 16) | ((bus & 0xff) << 8) \
+- | ((dev & 0x1f) << 3) | (fn & 0x7))
+-
++#define LOOP_TIMEOUT 100000
+ /*
+ * ACPI table definitions
+ *
+@@ -303,22 +298,6 @@ int amd_iommu_get_num_iommus(void)
+ return amd_iommus_present;
+ }
+
+-#ifdef CONFIG_IRQ_REMAP
+-static bool check_feature_on_all_iommus(u64 mask)
+-{
+- bool ret = false;
+- struct amd_iommu *iommu;
+-
+- for_each_iommu(iommu) {
+- ret = iommu_feature(iommu, mask);
+- if (!ret)
+- return false;
+- }
+-
+- return true;
+-}
+-#endif
+-
+ /*
+ * For IVHD type 0x11/0x40, EFR is also available via IVHD.
+ * Default to IVHD EFR since it is available sooner
+@@ -660,16 +639,6 @@ static int __init alloc_command_buffer(struct amd_iommu *iommu)
+ return iommu->cmd_buf ? 0 : -ENOMEM;
+ }
+
+-/*
+- * This function restarts event logging in case the IOMMU experienced
+- * an event log buffer overflow.
+- */
+-void amd_iommu_restart_event_logging(struct amd_iommu *iommu)
+-{
+- iommu_feature_disable(iommu, CONTROL_EVT_LOG_EN);
+- iommu_feature_enable(iommu, CONTROL_EVT_LOG_EN);
+-}
+-
+ /*
+ * This function resets the command buffer if the IOMMU stopped fetching
+ * commands from it.
+@@ -820,26 +789,15 @@ static int iommu_ga_log_enable(struct amd_iommu *iommu)
+ {
+ #ifdef CONFIG_IRQ_REMAP
+ u32 status, i;
+- u64 entry;
+
+ if (!iommu->ga_log)
+ return -EINVAL;
+
+- /* Check if already running */
+ status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
+- if (WARN_ON(status & (MMIO_STATUS_GALOG_RUN_MASK)))
+- return 0;
+-
+- entry = iommu_virt_to_phys(iommu->ga_log) | GA_LOG_SIZE_512;
+- memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_BASE_OFFSET,
+- &entry, sizeof(entry));
+- entry = (iommu_virt_to_phys(iommu->ga_log_tail) &
+- (BIT_ULL(52)-1)) & ~7ULL;
+- memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_TAIL_OFFSET,
+- &entry, sizeof(entry));
+- writel(0x00, iommu->mmio_base + MMIO_GA_HEAD_OFFSET);
+- writel(0x00, iommu->mmio_base + MMIO_GA_TAIL_OFFSET);
+
++ /* Check if already running */
++ if (status & (MMIO_STATUS_GALOG_RUN_MASK))
++ return 0;
+
+ iommu_feature_enable(iommu, CONTROL_GAINT_EN);
+ iommu_feature_enable(iommu, CONTROL_GALOG_EN);
+@@ -848,18 +806,19 @@ static int iommu_ga_log_enable(struct amd_iommu *iommu)
+ status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
+ if (status & (MMIO_STATUS_GALOG_RUN_MASK))
+ break;
+- udelay(10);
+ }
+
+- if (WARN_ON(i >= LOOP_TIMEOUT))
++ if (i >= LOOP_TIMEOUT)
+ return -EINVAL;
+ #endif /* CONFIG_IRQ_REMAP */
+ return 0;
+ }
+
++#ifdef CONFIG_IRQ_REMAP
+ static int iommu_init_ga_log(struct amd_iommu *iommu)
+ {
+-#ifdef CONFIG_IRQ_REMAP
++ u64 entry;
++
+ if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir))
+ return 0;
+
+@@ -873,13 +832,39 @@ static int iommu_init_ga_log(struct amd_iommu *iommu)
+ if (!iommu->ga_log_tail)
+ goto err_out;
+
++ entry = iommu_virt_to_phys(iommu->ga_log) | GA_LOG_SIZE_512;
++ memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_BASE_OFFSET,
++ &entry, sizeof(entry));
++ entry = (iommu_virt_to_phys(iommu->ga_log_tail) &
++ (BIT_ULL(52)-1)) & ~7ULL;
++ memcpy_toio(iommu->mmio_base + MMIO_GA_LOG_TAIL_OFFSET,
++ &entry, sizeof(entry));
++ writel(0x00, iommu->mmio_base + MMIO_GA_HEAD_OFFSET);
++ writel(0x00, iommu->mmio_base + MMIO_GA_TAIL_OFFSET);
++
+ return 0;
+ err_out:
+ free_ga_log(iommu);
+ return -EINVAL;
+-#else
+- return 0;
++}
++#endif /* CONFIG_IRQ_REMAP */
++
++static int iommu_init_ga(struct amd_iommu *iommu)
++{
++ int ret = 0;
++
++#ifdef CONFIG_IRQ_REMAP
++ /* Note: We have already checked GASup from IVRS table.
++ * Now, we need to make sure that GAMSup is set.
++ */
++ if (AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir) &&
++ !iommu_feature(iommu, FEATURE_GAM_VAPIC))
++ amd_iommu_guest_ir = AMD_IOMMU_GUEST_IR_LEGACY_GA;
++
++ ret = iommu_init_ga_log(iommu);
+ #endif /* CONFIG_IRQ_REMAP */
++
++ return ret;
+ }
+
+ static int __init alloc_cwwb_sem(struct amd_iommu *iommu)
+@@ -1866,7 +1851,7 @@ static int __init iommu_init_pci(struct amd_iommu *iommu)
+ if (iommu_feature(iommu, FEATURE_PPR) && alloc_ppr_log(iommu))
+ return -ENOMEM;
+
+- ret = iommu_init_ga_log(iommu);
++ ret = iommu_init_ga(iommu);
+ if (ret)
+ return ret;
+
+@@ -1929,8 +1914,8 @@ static void print_iommu_info(void)
+ pci_info(pdev, "Found IOMMU cap 0x%hx\n", iommu->cap_ptr);
+
+ if (iommu->cap & (1 << IOMMU_CAP_EFR)) {
+- pr_info("Extended features (%#llx):", iommu->features);
+-
++ pci_info(pdev, "Extended features (%#llx):",
++ iommu->features);
+ for (i = 0; i < ARRAY_SIZE(feat_str); ++i) {
+ if (iommu_feature(iommu, (1ULL << i)))
+ pr_cont(" %s", feat_str[i]);
+@@ -2411,14 +2396,6 @@ static void early_enable_iommus(void)
+ }
+
+ #ifdef CONFIG_IRQ_REMAP
+- /*
+- * Note: We have already checked GASup from IVRS table.
+- * Now, we need to make sure that GAMSup is set.
+- */
+- if (AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir) &&
+- !check_feature_on_all_iommus(FEATURE_GAM_VAPIC))
+- amd_iommu_guest_ir = AMD_IOMMU_GUEST_IR_LEGACY_GA;
+-
+ if (AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir))
+ amd_iommu_irq_ops.capability |= (1 << IRQ_POSTING_CAP);
+ #endif
+@@ -3050,32 +3027,24 @@ static int __init parse_amd_iommu_options(char *str)
+
+ static int __init parse_ivrs_ioapic(char *str)
+ {
+- u32 seg = 0, bus, dev, fn;
+- int id, i;
+- u32 devid;
++ unsigned int bus, dev, fn;
++ int ret, id, i;
++ u16 devid;
+
+- if (sscanf(str, "=%d@%x:%x.%x", &id, &bus, &dev, &fn) == 4 ||
+- sscanf(str, "=%d@%x:%x:%x.%x", &id, &seg, &bus, &dev, &fn) == 5)
+- goto found;
++ ret = sscanf(str, "[%d]=%x:%x.%x", &id, &bus, &dev, &fn);
+
+- if (sscanf(str, "[%d]=%x:%x.%x", &id, &bus, &dev, &fn) == 4 ||
+- sscanf(str, "[%d]=%x:%x:%x.%x", &id, &seg, &bus, &dev, &fn) == 5) {
+- pr_warn("ivrs_ioapic%s option format deprecated; use ivrs_ioapic=%d@%04x:%02x:%02x.%d instead\n",
+- str, id, seg, bus, dev, fn);
+- goto found;
++ if (ret != 4) {
++ pr_err("Invalid command line: ivrs_ioapic%s\n", str);
++ return 1;
+ }
+
+- pr_err("Invalid command line: ivrs_ioapic%s\n", str);
+- return 1;
+-
+-found:
+ if (early_ioapic_map_size == EARLY_MAP_SIZE) {
+ pr_err("Early IOAPIC map overflow - ignoring ivrs_ioapic%s\n",
+ str);
+ return 1;
+ }
+
+- devid = IVRS_GET_SBDF_ID(seg, bus, dev, fn);
++ devid = ((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7);
+
+ cmdline_maps = true;
+ i = early_ioapic_map_size++;
+@@ -3088,32 +3057,24 @@ static int __init parse_ivrs_ioapic(char *str)
+
+ static int __init parse_ivrs_hpet(char *str)
+ {
+- u32 seg = 0, bus, dev, fn;
+- int id, i;
+- u32 devid;
++ unsigned int bus, dev, fn;
++ int ret, id, i;
++ u16 devid;
+
+- if (sscanf(str, "=%d@%x:%x.%x", &id, &bus, &dev, &fn) == 4 ||
+- sscanf(str, "=%d@%x:%x:%x.%x", &id, &seg, &bus, &dev, &fn) == 5)
+- goto found;
++ ret = sscanf(str, "[%d]=%x:%x.%x", &id, &bus, &dev, &fn);
+
+- if (sscanf(str, "[%d]=%x:%x.%x", &id, &bus, &dev, &fn) == 4 ||
+- sscanf(str, "[%d]=%x:%x:%x.%x", &id, &seg, &bus, &dev, &fn) == 5) {
+- pr_warn("ivrs_hpet%s option format deprecated; use ivrs_hpet=%d@%04x:%02x:%02x.%d instead\n",
+- str, id, seg, bus, dev, fn);
+- goto found;
++ if (ret != 4) {
++ pr_err("Invalid command line: ivrs_hpet%s\n", str);
++ return 1;
+ }
+
+- pr_err("Invalid command line: ivrs_hpet%s\n", str);
+- return 1;
+-
+-found:
+ if (early_hpet_map_size == EARLY_MAP_SIZE) {
+ pr_err("Early HPET map overflow - ignoring ivrs_hpet%s\n",
+ str);
+ return 1;
+ }
+
+- devid = IVRS_GET_SBDF_ID(seg, bus, dev, fn);
++ devid = ((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7);
+
+ cmdline_maps = true;
+ i = early_hpet_map_size++;
+@@ -3126,37 +3087,17 @@ static int __init parse_ivrs_hpet(char *str)
+
+ static int __init parse_ivrs_acpihid(char *str)
+ {
+- u32 seg = 0, bus, dev, fn;
+- char *hid, *uid, *p, *addr;
++ u32 bus, dev, fn;
++ char *hid, *uid, *p;
+ char acpiid[ACPIHID_UID_LEN + ACPIHID_HID_LEN] = {0};
+- int i;
++ int ret, i;
+
+- addr = strchr(str, '@');
+- if (!addr) {
+- if (sscanf(str, "[%x:%x.%x]=%s", &bus, &dev, &fn, acpiid) == 4 ||
+- sscanf(str, "[%x:%x:%x.%x]=%s", &seg, &bus, &dev, &fn, acpiid) == 5) {
+- pr_warn("ivrs_acpihid%s option format deprecated; use ivrs_acpihid=%s@%04x:%02x:%02x.%d instead\n",
+- str, acpiid, seg, bus, dev, fn);
+- goto found;
+- }
+- goto not_found;
++ ret = sscanf(str, "[%x:%x.%x]=%s", &bus, &dev, &fn, acpiid);
++ if (ret != 4) {
++ pr_err("Invalid command line: ivrs_acpihid(%s)\n", str);
++ return 1;
+ }
+
+- /* We have the '@', make it the terminator to get just the acpiid */
+- *addr++ = 0;
+-
+- if (sscanf(str, "=%s", acpiid) != 1)
+- goto not_found;
+-
+- if (sscanf(addr, "%x:%x.%x", &bus, &dev, &fn) == 3 ||
+- sscanf(addr, "%x:%x:%x.%x", &seg, &bus, &dev, &fn) == 4)
+- goto found;
+-
+-not_found:
+- pr_err("Invalid command line: ivrs_acpihid%s\n", str);
+- return 1;
+-
+-found:
+ p = acpiid;
+ hid = strsep(&p, ":");
+ uid = p;
+@@ -3166,17 +3107,11 @@ static int __init parse_ivrs_acpihid(char *str)
+ return 1;
+ }
+
+- /*
+- * Ignore leading zeroes after ':', so e.g., AMDI0095:00
+- * will match AMDI0095:0 in the second strcmp in acpi_dev_hid_uid_match
+- */
+- while (*uid == '0' && *(uid + 1))
+- uid++;
+-
+ i = early_acpihid_map_size++;
+ memcpy(early_acpihid_map[i].hid, hid, strlen(hid));
+ memcpy(early_acpihid_map[i].uid, uid, strlen(uid));
+- early_acpihid_map[i].devid = IVRS_GET_SBDF_ID(seg, bus, dev, fn);
++ early_acpihid_map[i].devid =
++ ((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7);
+ early_acpihid_map[i].cmd_line = true;
+
+ return 1;
+diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
+index f216a86d9c81..5f1195791cb1 100644
+--- a/drivers/iommu/amd/iommu.c
++++ b/drivers/iommu/amd/iommu.c
+@@ -813,8 +813,7 @@ amd_iommu_set_pci_msi_domain(struct device *dev, struct amd_iommu *iommu) { }
+ #endif /* !CONFIG_IRQ_REMAP */
+
+ #define AMD_IOMMU_INT_MASK \
+- (MMIO_STATUS_EVT_OVERFLOW_INT_MASK | \
+- MMIO_STATUS_EVT_INT_MASK | \
++ (MMIO_STATUS_EVT_INT_MASK | \
+ MMIO_STATUS_PPR_INT_MASK | \
+ MMIO_STATUS_GALOG_INT_MASK)
+
+@@ -824,7 +823,7 @@ irqreturn_t amd_iommu_int_thread(int irq, void *data)
+ u32 status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
+
+ while (status & AMD_IOMMU_INT_MASK) {
+- /* Enable interrupt sources again */
++ /* Enable EVT and PPR and GA interrupts again */
+ writel(AMD_IOMMU_INT_MASK,
+ iommu->mmio_base + MMIO_STATUS_OFFSET);
+
+@@ -845,11 +844,6 @@ irqreturn_t amd_iommu_int_thread(int irq, void *data)
+ }
+ #endif
+
+- if (status & MMIO_STATUS_EVT_OVERFLOW_INT_MASK) {
+- pr_info_ratelimited("IOMMU event log overflow\n");
+- amd_iommu_restart_event_logging(iommu);
+- }
+-
+ /*
+ * Hardware bug: ERBT1312
+ * When re-enabling interrupt (by writing 1
+@@ -923,8 +917,7 @@ static void build_completion_wait(struct iommu_cmd *cmd,
+ memset(cmd, 0, sizeof(*cmd));
+ cmd->data[0] = lower_32_bits(paddr) | CMD_COMPL_WAIT_STORE_MASK;
+ cmd->data[1] = upper_32_bits(paddr);
+- cmd->data[2] = lower_32_bits(data);
+- cmd->data[3] = upper_32_bits(data);
++ cmd->data[2] = data;
+ CMD_SET_TYPE(cmd, CMD_COMPL_WAIT);
+ }
+
+diff --git a/drivers/iommu/amd/iommu_v2.c b/drivers/iommu/amd/iommu_v2.c
+index 16776e3c6eab..5ecc0bc608ec 100644
+--- a/drivers/iommu/amd/iommu_v2.c
++++ b/drivers/iommu/amd/iommu_v2.c
+@@ -587,7 +587,6 @@ static int ppr_notifier(struct notifier_block *nb, unsigned long e, void *data)
+ put_device_state(dev_state);
+
+ out:
+- pci_dev_put(pdev);
+ return ret;
+ }
+
+@@ -928,8 +927,10 @@ static int __init amd_iommu_v2_init(void)
+ {
+ int ret;
+
++ pr_info("AMD IOMMUv2 driver by Joerg Roedel \n");
++
+ if (!amd_iommu_v2_supported()) {
+- pr_info("AMD IOMMUv2 functionality not available on this system - This is not a bug.\n");
++ pr_info("AMD IOMMUv2 functionality not available on this system\n");
+ /*
+ * Load anyway to provide the symbols to other modules
+ * which may use AMD IOMMUv2 optionally.
+@@ -946,8 +947,6 @@ static int __init amd_iommu_v2_init(void)
+
+ amd_iommu_register_ppr_notifier(&ppr_nb);
+
+- pr_info("AMD IOMMUv2 loaded and initialized\n");
+-
+ return 0;
+
+ out:
+diff --git a/drivers/iommu/arm/arm-smmu-v3/Makefile b/drivers/iommu/arm/arm-smmu-v3/Makefile
+index 1338466d4d0d..54feb1ecccad 100644
+--- a/drivers/iommu/arm/arm-smmu-v3/Makefile
++++ b/drivers/iommu/arm/arm-smmu-v3/Makefile
+@@ -3,4 +3,3 @@ obj-$(CONFIG_ARM_SMMU_V3) += arm_smmu_v3.o
+ arm_smmu_v3-objs-y += arm-smmu-v3.o
+ arm_smmu_v3-objs-$(CONFIG_ARM_SMMU_V3_SVA) += arm-smmu-v3-sva.o
+ arm_smmu_v3-objs := $(arm_smmu_v3-objs-y)
+-obj-$(CONFIG_AGENT_SMMU_ATOS) += ascend_smmu.o
+diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c
+index a8e8fd9d7c8b..01094d348774 100644
+--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c
++++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c
+@@ -351,13 +351,15 @@ __arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm)
+ bond->smmu_mn = arm_smmu_mmu_notifier_get(smmu_domain, mm);
+ if (IS_ERR(bond->smmu_mn)) {
+ ret = PTR_ERR(bond->smmu_mn);
+- goto err_free_bond;
++ goto err_free_pasid;
+ }
+
+ list_add(&bond->list, &master->bonds);
+ trace_smmu_bind_alloc(dev, mm->pasid);
+ return &bond->sva;
+
++err_free_pasid:
++ iommu_sva_free_pasid(mm);
+ err_free_bond:
+ kfree(bond);
+ return ERR_PTR(ret);
+@@ -401,6 +403,7 @@ void arm_smmu_sva_unbind(struct iommu_sva *handle)
+ trace_smmu_unbind_free(handle->dev, bond->mm->pasid);
+ list_del(&bond->list);
+ arm_smmu_mmu_notifier_put(bond->smmu_mn);
++ iommu_sva_free_pasid(bond->mm);
+ kfree(bond);
+ } else {
+ trace_smmu_unbind_put(handle->dev, bond->mm->pasid);
+@@ -420,6 +423,8 @@ bool arm_smmu_sva_supported(struct arm_smmu_device *smmu)
+ unsigned long reg, fld;
+ unsigned long oas;
+ unsigned long asid_bits;
++
++#ifndef CONFIG_VENDOR_NPU
+ u32 feat_mask = ARM_SMMU_FEAT_COHERENCY;
+
+ if (vabits_actual == 52)
+@@ -427,6 +432,7 @@ bool arm_smmu_sva_supported(struct arm_smmu_device *smmu)
+
+ if ((smmu->features & feat_mask) != feat_mask)
+ return false;
++#endif
+
+ if (!(smmu->pgsize_bitmap & PAGE_SIZE))
+ return false;
+@@ -591,3 +597,13 @@ void arm_smmu_sva_notifier_synchronize(void)
+ */
+ mmu_notifier_synchronize();
+ }
++
++void arm_smmu_sva_mm_invalidate_range(struct iommu_domain *domain,
++ struct mm_struct *mm, unsigned long start, unsigned long size)
++{
++ unsigned long asid = arm64_mm_context_get(mm);
++ struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
++ arm_smmu_tlb_inv_range_asid(start, size, asid,
++ PAGE_SIZE, false, smmu_domain);
++ arm64_mm_context_put(mm);
++}
+diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+index 1ee14a59a3d6..14dbc7785605 100644
+--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
++++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+@@ -11,7 +11,6 @@
+
+ #include
+ #include
+-#include
+ #include
+ #include
+ #include
+@@ -30,11 +29,10 @@
+ #include
+ #include
+ #include
+-
+ #include
+
+-#include "arm-smmu-v3.h"
+ #include "../../iommu-sva-lib.h"
++#include "arm-smmu-v3.h"
+
+ static bool disable_bypass = true;
+ module_param(disable_bypass, bool, 0444);
+@@ -46,42 +44,6 @@ module_param(disable_msipolling, bool, 0444);
+ MODULE_PARM_DESC(disable_msipolling,
+ "Disable MSI-based polling for CMD_SYNC completion.");
+
+-#ifdef CONFIG_SMMU_BYPASS_DEV
+-struct smmu_bypass_device {
+- unsigned short vendor;
+- unsigned short device;
+-};
+-#define MAX_CMDLINE_SMMU_BYPASS_DEV 16
+-
+-static struct smmu_bypass_device smmu_bypass_devices[MAX_CMDLINE_SMMU_BYPASS_DEV];
+-static int smmu_bypass_devices_num;
+-
+-static int __init arm_smmu_bypass_dev_setup(char *str)
+-{
+- unsigned short vendor;
+- unsigned short device;
+- int ret;
+-
+- if (!str)
+- return -EINVAL;
+-
+- ret = sscanf(str, "%hx:%hx", &vendor, &device);
+- if (ret != 2)
+- return -EINVAL;
+-
+- if (smmu_bypass_devices_num >= MAX_CMDLINE_SMMU_BYPASS_DEV)
+- return -ERANGE;
+-
+- smmu_bypass_devices[smmu_bypass_devices_num].vendor = vendor;
+- smmu_bypass_devices[smmu_bypass_devices_num].device = device;
+- smmu_bypass_devices_num++;
+-
+- return 0;
+-}
+-
+-__setup("smmu.bypassdev=", arm_smmu_bypass_dev_setup);
+-#endif
+-
+ enum arm_smmu_msi_index {
+ EVTQ_MSI_INDEX,
+ GERROR_MSI_INDEX,
+@@ -89,6 +51,7 @@ enum arm_smmu_msi_index {
+ ARM_SMMU_MAX_MSIS,
+ };
+
++#ifdef CONFIG_ACPI
+ static phys_addr_t arm_smmu_msi_cfg[ARM_SMMU_MAX_MSIS][3] = {
+ [EVTQ_MSI_INDEX] = {
+ ARM_SMMU_EVTQ_IRQ_CFG0,
+@@ -106,6 +69,7 @@ static phys_addr_t arm_smmu_msi_cfg[ARM_SMMU_MAX_MSIS][3] = {
+ ARM_SMMU_PRIQ_IRQ_CFG2,
+ },
+ };
++#endif
+
+ struct arm_smmu_option_prop {
+ u32 opt;
+@@ -123,7 +87,7 @@ static DECLARE_IOASID_SET(private_ioasid);
+ struct arm_smmu_ctx_desc quiet_cd = { 0 };
+
+ static struct arm_smmu_option_prop arm_smmu_options[] = {
+- { ARM_SMMU_OPT_SKIP_PREFETCH, "hisilicon,broken-prefetch-cmd" },
++ { ARM_SMMU_OPT_SKIP_PREFETCH, "vendor,broken-prefetch-cmd" },
+ { ARM_SMMU_OPT_PAGE0_REGS_ONLY, "cavium,cn9900-broken-page1-regspace"},
+ { 0, NULL},
+ };
+@@ -273,18 +237,6 @@ static int queue_remove_raw(struct arm_smmu_queue *q, u64 *ent)
+ return 0;
+ }
+
+-static void arm_smmu_preempt_disable(struct arm_smmu_device *smmu)
+-{
+- if (smmu->ecmdq_enabled)
+- preempt_disable();
+-}
+-
+-static void arm_smmu_preempt_enable(struct arm_smmu_device *smmu)
+-{
+- if (smmu->ecmdq_enabled)
+- preempt_enable();
+-}
+-
+ /* High-level queue accessors */
+ static int arm_smmu_cmdq_build_cmd(u64 *cmd, struct arm_smmu_cmdq_ent *ent)
+ {
+@@ -381,22 +333,10 @@ static int arm_smmu_cmdq_build_cmd(u64 *cmd, struct arm_smmu_cmdq_ent *ent)
+ return 0;
+ }
+
+-static struct arm_smmu_cmdq *arm_smmu_get_cmdq(struct arm_smmu_device *smmu)
+-{
+- if (smmu->ecmdq_enabled) {
+- struct arm_smmu_ecmdq *ecmdq;
+-
+- ecmdq = *this_cpu_ptr(smmu->ecmdqs);
+-
+- return &ecmdq->cmdq;
+- }
+-
+- return &smmu->cmdq;
+-}
+-
+ static void arm_smmu_cmdq_build_sync_cmd(u64 *cmd, struct arm_smmu_device *smmu,
+- struct arm_smmu_queue *q, u32 prod)
++ u32 prod)
+ {
++ struct arm_smmu_queue *q = &smmu->cmdq.q;
+ struct arm_smmu_cmdq_ent ent = {
+ .opcode = CMDQ_OP_CMD_SYNC,
+ };
+@@ -413,8 +353,7 @@ static void arm_smmu_cmdq_build_sync_cmd(u64 *cmd, struct arm_smmu_device *smmu,
+ arm_smmu_cmdq_build_cmd(cmd, &ent);
+ }
+
+-static void __arm_smmu_cmdq_skip_err(struct arm_smmu_device *smmu,
+- struct arm_smmu_queue *q)
++static void arm_smmu_cmdq_skip_err(struct arm_smmu_device *smmu)
+ {
+ static const char *cerror_str[] = {
+ [CMDQ_ERR_CERROR_NONE_IDX] = "No error",
+@@ -425,6 +364,7 @@ static void __arm_smmu_cmdq_skip_err(struct arm_smmu_device *smmu,
+
+ int i;
+ u64 cmd[CMDQ_ENT_DWORDS];
++ struct arm_smmu_queue *q = &smmu->cmdq.q;
+ u32 cons = readl_relaxed(q->cons_reg);
+ u32 idx = FIELD_GET(CMDQ_CONS_ERR, cons);
+ struct arm_smmu_cmdq_ent cmd_sync = {
+@@ -470,43 +410,6 @@ static void __arm_smmu_cmdq_skip_err(struct arm_smmu_device *smmu,
+ queue_write(Q_ENT(q, cons), cmd, q->ent_dwords);
+ }
+
+-static void arm_smmu_cmdq_skip_err(struct arm_smmu_device *smmu)
+-{
+- __arm_smmu_cmdq_skip_err(smmu, &smmu->cmdq.q);
+-}
+-
+-static void arm_smmu_ecmdq_skip_err(struct arm_smmu_device *smmu)
+-{
+- int i;
+- u32 prod, cons;
+- struct arm_smmu_queue *q;
+- struct arm_smmu_ecmdq *ecmdq;
+-
+- for (i = 0; i < smmu->nr_ecmdq; i++) {
+- unsigned long flags;
+-
+- ecmdq = *per_cpu_ptr(smmu->ecmdqs, i);
+- q = &ecmdq->cmdq.q;
+-
+- prod = readl_relaxed(q->prod_reg);
+- cons = readl_relaxed(q->cons_reg);
+- if (((prod ^ cons) & ECMDQ_CONS_ERR) == 0)
+- continue;
+-
+- __arm_smmu_cmdq_skip_err(smmu, q);
+-
+- write_lock_irqsave(&q->ecmdq_lock, flags);
+- q->ecmdq_prod &= ~ECMDQ_PROD_ERRACK;
+- q->ecmdq_prod |= cons & ECMDQ_CONS_ERR;
+-
+- prod = readl_relaxed(q->prod_reg);
+- prod &= ~ECMDQ_PROD_ERRACK;
+- prod |= cons & ECMDQ_CONS_ERR;
+- writel(prod, q->prod_reg);
+- write_unlock_irqrestore(&q->ecmdq_lock, flags);
+- }
+-}
+-
+ /*
+ * Command queue locking.
+ * This is a form of bastardised rwlock with the following major changes:
+@@ -673,7 +576,7 @@ static int arm_smmu_cmdq_poll_until_not_full(struct arm_smmu_device *smmu,
+ {
+ unsigned long flags;
+ struct arm_smmu_queue_poll qp;
+- struct arm_smmu_cmdq *cmdq = arm_smmu_get_cmdq(smmu);
++ struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
+ int ret = 0;
+
+ /*
+@@ -689,7 +592,7 @@ static int arm_smmu_cmdq_poll_until_not_full(struct arm_smmu_device *smmu,
+
+ queue_poll_init(smmu, &qp);
+ do {
+- llq->val = READ_ONCE(cmdq->q.llq.val);
++ llq->val = READ_ONCE(smmu->cmdq.q.llq.val);
+ if (!queue_full(llq))
+ break;
+
+@@ -708,7 +611,7 @@ static int __arm_smmu_cmdq_poll_until_msi(struct arm_smmu_device *smmu,
+ {
+ int ret = 0;
+ struct arm_smmu_queue_poll qp;
+- struct arm_smmu_cmdq *cmdq = arm_smmu_get_cmdq(smmu);
++ struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
+ u32 *cmd = (u32 *)(Q_ENT(&cmdq->q, llq->prod));
+
+ queue_poll_init(smmu, &qp);
+@@ -731,12 +634,12 @@ static int __arm_smmu_cmdq_poll_until_consumed(struct arm_smmu_device *smmu,
+ struct arm_smmu_ll_queue *llq)
+ {
+ struct arm_smmu_queue_poll qp;
+- struct arm_smmu_cmdq *cmdq = arm_smmu_get_cmdq(smmu);
++ struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
+ u32 prod = llq->prod;
+ int ret = 0;
+
+ queue_poll_init(smmu, &qp);
+- llq->val = READ_ONCE(cmdq->q.llq.val);
++ llq->val = READ_ONCE(smmu->cmdq.q.llq.val);
+ do {
+ if (queue_consumed(llq, prod))
+ break;
+@@ -803,87 +706,6 @@ static void arm_smmu_cmdq_write_entries(struct arm_smmu_cmdq *cmdq, u64 *cmds,
+ }
+ }
+
+-/*
+- * The function is used when the current core exclusively occupies an ECMDQ.
+- * This is a reduced version of arm_smmu_cmdq_issue_cmdlist(), which eliminates
+- * a lot of unnecessary inter-core competition considerations.
+- */
+-static int arm_smmu_ecmdq_issue_cmdlist(struct arm_smmu_device *smmu,
+- struct arm_smmu_cmdq *cmdq,
+- u64 *cmds, int n, bool sync)
+-{
+- u32 prod;
+- unsigned long flags;
+- struct arm_smmu_ll_queue llq = {
+- .max_n_shift = cmdq->q.llq.max_n_shift,
+- }, head;
+- int ret = 0;
+-
+- /* 1. Allocate some space in the queue */
+- local_irq_save(flags);
+- llq.val = READ_ONCE(cmdq->q.llq.val);
+- do {
+- u64 old;
+-
+- while (!queue_has_space(&llq, n + sync)) {
+- local_irq_restore(flags);
+- if (arm_smmu_cmdq_poll_until_not_full(smmu, &llq))
+- dev_err_ratelimited(smmu->dev, "ECMDQ timeout\n");
+- local_irq_save(flags);
+- }
+-
+- head.cons = llq.cons;
+- head.prod = queue_inc_prod_n(&llq, n + sync);
+-
+- old = cmpxchg_relaxed(&cmdq->q.llq.val, llq.val, head.val);
+- if (old == llq.val)
+- break;
+-
+- llq.val = old;
+- } while (1);
+-
+- /* 2. Write our commands into the queue */
+- arm_smmu_cmdq_write_entries(cmdq, cmds, llq.prod, n);
+- if (sync) {
+- u64 cmd_sync[CMDQ_ENT_DWORDS];
+-
+- prod = queue_inc_prod_n(&llq, n);
+- arm_smmu_cmdq_build_sync_cmd(cmd_sync, smmu, &cmdq->q, prod);
+- queue_write(Q_ENT(&cmdq->q, prod), cmd_sync, CMDQ_ENT_DWORDS);
+- }
+-
+- /* 3. Ensuring commands are visible first */
+- dma_wmb();
+-
+- /* 4. Advance the hardware prod pointer */
+- read_lock(&cmdq->q.ecmdq_lock);
+- writel_relaxed(head.prod | cmdq->q.ecmdq_prod, cmdq->q.prod_reg);
+- read_unlock(&cmdq->q.ecmdq_lock);
+-
+- /* 5. If we are inserting a CMD_SYNC, we must wait for it to complete */
+- if (sync) {
+- llq.prod = queue_inc_prod_n(&llq, n);
+- ret = arm_smmu_cmdq_poll_until_sync(smmu, &llq);
+- if (ret) {
+- dev_err_ratelimited(smmu->dev,
+- "CMD_SYNC timeout at 0x%08x [hwprod 0x%08x, hwcons 0x%08x]\n",
+- llq.prod,
+- readl_relaxed(cmdq->q.prod_reg),
+- readl_relaxed(cmdq->q.cons_reg));
+- }
+-
+- /*
+- * Update cmdq->q.llq.cons, to improve the success rate of
+- * queue_has_space() when some new commands are inserted next
+- * time.
+- */
+- WRITE_ONCE(cmdq->q.llq.cons, llq.cons);
+- }
+-
+- local_irq_restore(flags);
+- return ret;
+-}
+-
+ /*
+ * This is the actual insertion function, and provides the following
+ * ordering guarantees to callers:
+@@ -907,15 +729,12 @@ static int arm_smmu_cmdq_issue_cmdlist(struct arm_smmu_device *smmu,
+ u32 prod;
+ unsigned long flags;
+ bool owner;
+- struct arm_smmu_cmdq *cmdq = arm_smmu_get_cmdq(smmu);
++ struct arm_smmu_cmdq *cmdq = &smmu->cmdq;
+ struct arm_smmu_ll_queue llq = {
+ .max_n_shift = cmdq->q.llq.max_n_shift,
+ }, head = llq;
+ int ret = 0;
+
+- if (!cmdq->shared)
+- return arm_smmu_ecmdq_issue_cmdlist(smmu, cmdq, cmds, n, sync);
+-
+ /* 1. Allocate some space in the queue */
+ local_irq_save(flags);
+ llq.val = READ_ONCE(cmdq->q.llq.val);
+@@ -950,7 +769,7 @@ static int arm_smmu_cmdq_issue_cmdlist(struct arm_smmu_device *smmu,
+ arm_smmu_cmdq_write_entries(cmdq, cmds, llq.prod, n);
+ if (sync) {
+ prod = queue_inc_prod_n(&llq, n);
+- arm_smmu_cmdq_build_sync_cmd(cmd_sync, smmu, &cmdq->q, prod);
++ arm_smmu_cmdq_build_sync_cmd(cmd_sync, smmu, prod);
+ queue_write(Q_ENT(&cmdq->q, prod), cmd_sync, CMDQ_ENT_DWORDS);
+
+ /*
+@@ -987,13 +806,7 @@ static int arm_smmu_cmdq_issue_cmdlist(struct arm_smmu_device *smmu,
+ * d. Advance the hardware prod pointer
+ * Control dependency ordering from the entries becoming valid.
+ */
+- if (smmu->ecmdq_enabled) {
+- read_lock(&cmdq->q.ecmdq_lock);
+- writel_relaxed(prod | cmdq->q.ecmdq_prod, cmdq->q.prod_reg);
+- read_unlock(&cmdq->q.ecmdq_lock);
+- } else {
+- writel_relaxed(prod, cmdq->q.prod_reg);
+- }
++ writel_relaxed(prod, cmdq->q.prod_reg);
+
+ /*
+ * e. Tell the next owner we're done
+@@ -1029,9 +842,8 @@ static int arm_smmu_cmdq_issue_cmdlist(struct arm_smmu_device *smmu,
+ return ret;
+ }
+
+-static int __arm_smmu_cmdq_issue_cmd(struct arm_smmu_device *smmu,
+- struct arm_smmu_cmdq_ent *ent,
+- bool sync)
++static int arm_smmu_cmdq_issue_cmd(struct arm_smmu_device *smmu,
++ struct arm_smmu_cmdq_ent *ent)
+ {
+ u64 cmd[CMDQ_ENT_DWORDS];
+
+@@ -1041,19 +853,12 @@ static int __arm_smmu_cmdq_issue_cmd(struct arm_smmu_device *smmu,
+ return -EINVAL;
+ }
+
+- return arm_smmu_cmdq_issue_cmdlist(smmu, cmd, 1, sync);
+-}
+-
+-static int arm_smmu_cmdq_issue_cmd(struct arm_smmu_device *smmu,
+- struct arm_smmu_cmdq_ent *ent)
+-{
+- return __arm_smmu_cmdq_issue_cmd(smmu, ent, false);
++ return arm_smmu_cmdq_issue_cmdlist(smmu, cmd, 1, false);
+ }
+
+-static int arm_smmu_cmdq_issue_cmd_with_sync(struct arm_smmu_device *smmu,
+- struct arm_smmu_cmdq_ent *ent)
++static int arm_smmu_cmdq_issue_sync(struct arm_smmu_device *smmu)
+ {
+- return __arm_smmu_cmdq_issue_cmd(smmu, ent, true);
++ return arm_smmu_cmdq_issue_cmdlist(smmu, NULL, 0, true);
+ }
+
+ static void arm_smmu_cmdq_batch_add(struct arm_smmu_device *smmu,
+@@ -1144,7 +949,8 @@ void arm_smmu_tlb_inv_asid(struct arm_smmu_device *smmu, u16 asid)
+ .tlbi.asid = asid,
+ };
+
+- arm_smmu_cmdq_issue_cmd_with_sync(smmu, &cmd);
++ arm_smmu_cmdq_issue_cmd(smmu, &cmd);
++ arm_smmu_cmdq_issue_sync(smmu);
+ }
+
+ static void arm_smmu_sync_cd(struct arm_smmu_domain *smmu_domain,
+@@ -1163,7 +969,6 @@ static void arm_smmu_sync_cd(struct arm_smmu_domain *smmu_domain,
+ },
+ };
+
+- arm_smmu_preempt_disable(smmu);
+ spin_lock_irqsave(&smmu_domain->devices_lock, flags);
+ list_for_each_entry(master, &smmu_domain->devices, domain_head) {
+ for (i = 0; i < master->num_streams; i++) {
+@@ -1174,7 +979,6 @@ static void arm_smmu_sync_cd(struct arm_smmu_domain *smmu_domain,
+ spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
+
+ arm_smmu_cmdq_batch_submit(smmu, &cmds);
+- arm_smmu_preempt_enable(smmu);
+ }
+
+ static int arm_smmu_alloc_cd_leaf_table(struct arm_smmu_device *smmu,
+@@ -1438,7 +1242,8 @@ static void arm_smmu_sync_ste_for_sid(struct arm_smmu_device *smmu, u32 sid)
+ },
+ };
+
+- arm_smmu_cmdq_issue_cmd_with_sync(smmu, &cmd);
++ arm_smmu_cmdq_issue_cmd(smmu, &cmd);
++ arm_smmu_cmdq_issue_sync(smmu);
+ }
+
+ static void arm_smmu_write_strtab_ent(struct arm_smmu_master *master, u32 sid,
+@@ -1764,7 +1569,6 @@ static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev)
+ dev_info(smmu->dev, "\t0x%016llx\n",
+ (unsigned long long)evt[i]);
+
+- cond_resched();
+ }
+
+ /*
+@@ -1981,9 +1785,6 @@ static irqreturn_t arm_smmu_gerror_handler(int irq, void *dev)
+ if (active & GERROR_CMDQ_ERR)
+ arm_smmu_cmdq_skip_err(smmu);
+
+- if (active & GERROR_CMDQP_ERR)
+- arm_smmu_ecmdq_skip_err(smmu);
+-
+ writel(gerror, smmu->base + ARM_SMMU_GERRORN);
+ return IRQ_HANDLED;
+ }
+@@ -1999,11 +1800,55 @@ static irqreturn_t arm_smmu_combined_irq_thread(int irq, void *dev)
+ return IRQ_HANDLED;
+ }
+
++#ifndef CONFIG_VENDOR_NPU
+ static irqreturn_t arm_smmu_combined_irq_handler(int irq, void *dev)
+ {
+ arm_smmu_gerror_handler(irq, dev);
+ return IRQ_WAKE_THREAD;
+ }
++#else
++static irqreturn_t arm_smmu_evtq_handler(int irq, void *dev)
++{
++ return IRQ_WAKE_THREAD;
++}
++
++static irqreturn_t arm_smmu_cmdq_sync_handler(int irq, void *dev)
++{
++ struct arm_smmu_device *smmu = dev;
++ /* We don't actually use CMD_SYNC interrupts for anything */
++ dev_warn(smmu->dev, "Receive cmdq_sync interrupt=======================>\n");
++ return IRQ_HANDLED;
++}
++
++static irqreturn_t arm_smmu_combined_irq_handler(int irq, void *dev)
++{
++ irqreturn_t ret = IRQ_NONE;
++ u32 irq_status = 0;
++ u32 raw_irq_status = 0;
++ u32 reg = (TCU_EVENT_Q_IRQ_CLR | TCU_CMD_SYNC_IRQ_CLR |
++ TCU_GERROR_IRQ_CLR | TCU_EVENTTO_CLR);
++ struct arm_smmu_device *smmu = (struct arm_smmu_device *)dev;
++
++ irq_status = readl_relaxed(smmu->base + SMMU_IRPT_STAT_NS);
++ raw_irq_status = readl_relaxed(smmu->base + SMMU_IRPT_RAW_NS);
++ dev_dbg(smmu->dev, "irq info: status:0x%x,raw_status:0x%x\n", irq_status, raw_irq_status);
++ writel_relaxed(reg, smmu->base + SMMU_IRPT_CLR_NS);
++
++ if (irq_status & TCU_EVENT_Q_IRQ)
++ ret = arm_smmu_evtq_handler(irq, smmu);
++
++ if (irq_status & TCU_CMD_SYNC_IRQ)
++ ret |= arm_smmu_cmdq_sync_handler(irq, dev);
++
++ if (irq_status & TCU_GERROR_IRQ)
++ ret |= arm_smmu_gerror_handler(irq, dev);
++
++ if (ret & IRQ_WAKE_THREAD)
++ return IRQ_WAKE_THREAD;
++ else
++ return ret;
++}
++#endif
+
+ static void
+ arm_smmu_atc_inv_to_cmd(int ssid, unsigned long iova, size_t size,
+@@ -2074,36 +1919,29 @@ arm_smmu_atc_inv_to_cmd(int ssid, unsigned long iova, size_t size,
+
+ static int arm_smmu_atc_inv_master(struct arm_smmu_master *master, unsigned int ssid)
+ {
+- int i, ret;
++ int i;
+ struct arm_smmu_cmdq_ent cmd;
+- struct arm_smmu_cmdq_batch cmds = {};
+- struct arm_smmu_device *smmu = master->smmu;
+
+ arm_smmu_atc_inv_to_cmd(ssid, 0, 0, &cmd);
+
+- arm_smmu_preempt_disable(smmu);
+ for (i = 0; i < master->num_streams; i++) {
+ cmd.atc.sid = master->streams[i].id;
+- arm_smmu_cmdq_batch_add(smmu, &cmds, &cmd);
++ arm_smmu_cmdq_issue_cmd(master->smmu, &cmd);
+ }
+
+- ret = arm_smmu_cmdq_batch_submit(smmu, &cmds);
+- arm_smmu_preempt_enable(smmu);
+-
+- return ret;
++ return arm_smmu_cmdq_issue_sync(master->smmu);
+ }
+
+ int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid,
+ unsigned long iova, size_t size)
+ {
+- int i, ret;
++ int i;
+ unsigned long flags;
+ struct arm_smmu_cmdq_ent cmd;
+ struct arm_smmu_master *master;
+ struct arm_smmu_cmdq_batch cmds = {};
+- struct arm_smmu_device *smmu = smmu_domain->smmu;
+
+- if (!(smmu->features & ARM_SMMU_FEAT_ATS))
++ if (!(smmu_domain->smmu->features & ARM_SMMU_FEAT_ATS))
+ return 0;
+
+ /*
+@@ -2125,7 +1963,6 @@ int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid,
+
+ arm_smmu_atc_inv_to_cmd(ssid, iova, size, &cmd);
+
+- arm_smmu_preempt_disable(smmu);
+ spin_lock_irqsave(&smmu_domain->devices_lock, flags);
+ list_for_each_entry(master, &smmu_domain->devices, domain_head) {
+ if (!master->ats_enabled)
+@@ -2133,15 +1970,12 @@ int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid,
+
+ for (i = 0; i < master->num_streams; i++) {
+ cmd.atc.sid = master->streams[i].id;
+- arm_smmu_cmdq_batch_add(smmu, &cmds, &cmd);
++ arm_smmu_cmdq_batch_add(smmu_domain->smmu, &cmds, &cmd);
+ }
+ }
+ spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
+
+- ret = arm_smmu_cmdq_batch_submit(smmu, &cmds);
+- arm_smmu_preempt_enable(smmu);
+-
+- return ret;
++ return arm_smmu_cmdq_batch_submit(smmu_domain->smmu, &cmds);
+ }
+
+ /* IO_PGTABLE API */
+@@ -2163,7 +1997,8 @@ static void arm_smmu_tlb_inv_context(void *cookie)
+ } else {
+ cmd.opcode = CMDQ_OP_TLBI_S12_VMALL;
+ cmd.tlbi.vmid = smmu_domain->s2_cfg.vmid;
+- arm_smmu_cmdq_issue_cmd_with_sync(smmu, &cmd);
++ arm_smmu_cmdq_issue_cmd(smmu, &cmd);
++ arm_smmu_cmdq_issue_sync(smmu);
+ }
+ if (smmu_domain->parent)
+ arm_smmu_atc_inv_domain(smmu_domain->parent, smmu_domain->ssid,
+@@ -2199,7 +2034,6 @@ static void __arm_smmu_tlb_inv_range(struct arm_smmu_cmdq_ent *cmd,
+ num_pages = size >> tg;
+ }
+
+- arm_smmu_preempt_disable(smmu);
+ while (iova < end) {
+ if (smmu->features & ARM_SMMU_FEAT_RANGE_INV) {
+ /*
+@@ -2231,7 +2065,6 @@ static void __arm_smmu_tlb_inv_range(struct arm_smmu_cmdq_ent *cmd,
+ iova += inv_range;
+ }
+ arm_smmu_cmdq_batch_submit(smmu, &cmds);
+- arm_smmu_preempt_enable(smmu);
+ }
+
+ static void arm_smmu_tlb_inv_range_domain(unsigned long iova, size_t size,
+@@ -2385,7 +2218,7 @@ static void arm_smmu_domain_free(struct iommu_domain *domain)
+ arm_smmu_free_asid(&cfg->cd);
+ mutex_unlock(&arm_smmu_asid_lock);
+ if (smmu_domain->ssid)
+- ioasid_free(smmu_domain->ssid);
++ ioasid_put(smmu_domain->ssid);
+ } else {
+ struct arm_smmu_s2_cfg *cfg = &smmu_domain->s2_cfg;
+ if (cfg->vmid)
+@@ -2420,7 +2253,6 @@ static int arm_smmu_domain_finalise_cd(struct arm_smmu_domain *smmu_domain,
+ FIELD_PREP(CTXDESC_CD_0_TCR_ORGN0, tcr->orgn) |
+ FIELD_PREP(CTXDESC_CD_0_TCR_SH0, tcr->sh) |
+ FIELD_PREP(CTXDESC_CD_0_TCR_IPS, tcr->ips) |
+- CTXDESC_CD_0_TCR_HA | CTXDESC_CD_0_TCR_HD |
+ CTXDESC_CD_0_TCR_EPD1 | CTXDESC_CD_0_AA64;
+ cfg->cd.mair = pgtbl_cfg->arm_lpae_s1_cfg.mair;
+ return 0;
+@@ -2552,13 +2384,6 @@ static int arm_smmu_domain_finalise(struct iommu_domain *domain,
+
+ if (smmu_domain->non_strict)
+ pgtbl_cfg.quirks |= IO_PGTABLE_QUIRK_NON_STRICT;
+- if (smmu->features & ARM_SMMU_FEAT_HD)
+- pgtbl_cfg.quirks |= IO_PGTABLE_QUIRK_ARM_HD;
+-
+- if (smmu->features & ARM_SMMU_FEAT_BBML1)
+- pgtbl_cfg.quirks |= IO_PGTABLE_QUIRK_ARM_BBML1;
+- else if (smmu->features & ARM_SMMU_FEAT_BBML2)
+- pgtbl_cfg.quirks |= IO_PGTABLE_QUIRK_ARM_BBML2;
+
+ pgtbl_ops = alloc_io_pgtable_ops(fmt, &pgtbl_cfg, smmu_domain);
+ if (!pgtbl_ops)
+@@ -2912,7 +2737,6 @@ static size_t arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova,
+ static void arm_smmu_flush_iotlb_all(struct iommu_domain *domain)
+ {
+ struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
+-
+ if (smmu_domain->smmu)
+ arm_smmu_tlb_inv_context(smmu_domain);
+ }
+@@ -3059,10 +2883,6 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev)
+ struct arm_smmu_device *smmu;
+ struct arm_smmu_master *master;
+ struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
+-#ifdef CONFIG_ASCEND_FEATURES
+- u32 sid;
+- const union acpi_object *obj = NULL;
+-#endif
+
+ if (!fwspec || fwspec->ops != &arm_smmu_ops)
+ return ERR_PTR(-ENODEV);
+@@ -3109,16 +2929,6 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev)
+ smmu->features & ARM_SMMU_FEAT_STALL_FORCE)
+ master->stall_enabled = true;
+
+-#ifdef CONFIG_ASCEND_FEATURES
+- if (!acpi_dev_get_property(ACPI_COMPANION(dev),
+- "streamid", ACPI_TYPE_INTEGER, &obj) && obj) {
+- sid = obj->integer.value;
+- if (iommu_fwspec_add_ids(dev, &sid, 1))
+- dev_info(dev, "failed to add ids\n");
+- master->stall_enabled = true;
+- master->ssid_bits = 0x10;
+- }
+-#endif
+ arm_smmu_init_pri(master);
+
+ return &smmu->iommu;
+@@ -3239,274 +3049,73 @@ static int arm_smmu_domain_set_attr(struct iommu_domain *domain,
+ return ret;
+ }
+
+-static int arm_smmu_split_block(struct iommu_domain *domain,
+- unsigned long iova, size_t size)
++static int arm_smmu_of_xlate(struct device *dev, struct of_phandle_args *args)
+ {
+- struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
+- struct arm_smmu_device *smmu = smmu_domain->smmu;
+- struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
+- size_t handled_size;
+-
+- if (!(smmu->features & (ARM_SMMU_FEAT_BBML1 | ARM_SMMU_FEAT_BBML2))) {
+- dev_err(smmu->dev, "don't support BBML1/2, can't split block\n");
+- return -ENODEV;
+- }
+- if (!ops || !ops->split_block) {
+- pr_err("io-pgtable don't realize split block\n");
+- return -ENODEV;
+- }
+-
+- handled_size = ops->split_block(ops, iova, size);
+- if (handled_size != size) {
+- pr_err("split block failed\n");
+- return -EFAULT;
+- }
+-
+- return 0;
++ return iommu_fwspec_add_ids(dev, args->args, 1);
+ }
+
+-static int __arm_smmu_merge_page(struct iommu_domain *domain,
+- unsigned long iova, phys_addr_t paddr,
+- size_t size, int prot)
++static void arm_smmu_get_resv_regions(struct device *dev,
++ struct list_head *head)
+ {
+- struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
+- struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
+- size_t handled_size;
+-
+- if (!ops || !ops->merge_page) {
+- pr_err("io-pgtable don't realize merge page\n");
+- return -ENODEV;
+- }
+-
+- while (size) {
+- size_t pgsize = iommu_pgsize(domain, iova | paddr, size);
+-
+- handled_size = ops->merge_page(ops, iova, paddr, pgsize, prot);
+- if (handled_size != pgsize) {
+- pr_err("merge page failed\n");
+- return -EFAULT;
+- }
++ struct iommu_resv_region *region;
++ int prot = IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO;
+
+- pr_debug("merge handled: iova 0x%lx pa %pa size 0x%zx\n",
+- iova, &paddr, pgsize);
++ region = iommu_alloc_resv_region(MSI_IOVA_BASE, MSI_IOVA_LENGTH,
++ prot, IOMMU_RESV_SW_MSI);
++ if (!region)
++ return;
+
+- iova += pgsize;
+- paddr += pgsize;
+- size -= pgsize;
+- }
++ list_add_tail(®ion->list, head);
+
+- return 0;
++ iommu_dma_get_resv_regions(dev, head);
+ }
+
+-static int arm_smmu_merge_page(struct iommu_domain *domain, unsigned long iova,
+- size_t size, int prot)
++static bool arm_smmu_dev_has_feature(struct device *dev,
++ enum iommu_dev_features feat)
+ {
+- struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
+- struct arm_smmu_device *smmu = smmu_domain->smmu;
+- struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
+- phys_addr_t phys;
+- dma_addr_t p, i;
+- size_t cont_size;
+- int ret = 0;
+-
+- if (!(smmu->features & (ARM_SMMU_FEAT_BBML1 | ARM_SMMU_FEAT_BBML2))) {
+- dev_err(smmu->dev, "don't support BBML1/2, can't merge page\n");
+- return -ENODEV;
+- }
+-
+- if (!ops || !ops->iova_to_phys)
+- return -ENODEV;
+-
+- while (size) {
+- phys = ops->iova_to_phys(ops, iova);
+- cont_size = PAGE_SIZE;
+- p = phys + cont_size;
+- i = iova + cont_size;
+-
+- while (cont_size < size && p == ops->iova_to_phys(ops, i)) {
+- p += PAGE_SIZE;
+- i += PAGE_SIZE;
+- cont_size += PAGE_SIZE;
+- }
++ struct arm_smmu_master *master = dev_iommu_priv_get(dev);
+
+- if (cont_size != PAGE_SIZE) {
+- ret = __arm_smmu_merge_page(domain, iova, phys,
+- cont_size, prot);
+- if (ret)
+- break;
+- }
++ if (!master)
++ return false;
+
+- iova += cont_size;
+- size -= cont_size;
++ switch (feat) {
++ case IOMMU_DEV_FEAT_IOPF:
++ return arm_smmu_master_iopf_supported(master);
++ case IOMMU_DEV_FEAT_SVA:
++ return arm_smmu_master_sva_supported(master);
++ case IOMMU_DEV_FEAT_AUX:
++ return master->ssid_bits != 0;
++ default:
++ return false;
+ }
+-
+- return ret;
+ }
+
+-static bool arm_smmu_support_dirty_log(struct iommu_domain *domain)
++static bool arm_smmu_dev_feature_enabled(struct device *dev,
++ enum iommu_dev_features feat)
+ {
+- struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
++ struct arm_smmu_master *master = dev_iommu_priv_get(dev);
++
++ if (!master)
++ return false;
+
+- return !!(smmu_domain->smmu->features & ARM_SMMU_FEAT_HD);
++ switch (feat) {
++ case IOMMU_DEV_FEAT_IOPF:
++ return master->iopf_enabled;
++ case IOMMU_DEV_FEAT_SVA:
++ return arm_smmu_master_sva_enabled(master);
++ case IOMMU_DEV_FEAT_AUX:
++ return master->auxd_enabled;
++ default:
++ return false;
++ }
+ }
+
+-static int arm_smmu_switch_dirty_log(struct iommu_domain *domain, bool enable,
+- unsigned long iova, size_t size, int prot)
++static int arm_smmu_dev_enable_feature(struct device *dev,
++ enum iommu_dev_features feat)
+ {
+- struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
+- struct arm_smmu_device *smmu = smmu_domain->smmu;
++ struct arm_smmu_master *master = dev_iommu_priv_get(dev);
+
+- if (!(smmu->features & ARM_SMMU_FEAT_HD))
+- return -ENODEV;
+- if (smmu_domain->stage != ARM_SMMU_DOMAIN_S1)
+- return -EINVAL;
+-
+- if (enable) {
+- /*
+- * For SMMU, the hardware dirty management is always enabled if
+- * hardware supports HTTU HD. The action to start dirty log is
+- * spliting block mapping.
+- *
+- * We don't return error even if the split operation fail, as we
+- * can still track dirty at block granule, which is still a much
+- * better choice compared to full dirty policy.
+- */
+- arm_smmu_split_block(domain, iova, size);
+- } else {
+- /*
+- * For SMMU, the hardware dirty management is always enabled if
+- * hardware supports HTTU HD. The action to stop dirty log is
+- * merging page mapping.
+- *
+- * We don't return error even if the merge operation fail, as it
+- * just effects performace of DMA transaction.
+- */
+- arm_smmu_merge_page(domain, iova, size, prot);
+- }
+-
+- return 0;
+-}
+-
+-static int arm_smmu_sync_dirty_log(struct iommu_domain *domain,
+- unsigned long iova, size_t size,
+- unsigned long *bitmap,
+- unsigned long base_iova,
+- unsigned long bitmap_pgshift)
+-{
+- struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
+- struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
+- struct arm_smmu_device *smmu = smmu_domain->smmu;
+-
+- if (!(smmu->features & ARM_SMMU_FEAT_HD))
+- return -ENODEV;
+- if (smmu_domain->stage != ARM_SMMU_DOMAIN_S1)
+- return -EINVAL;
+-
+- if (!ops || !ops->sync_dirty_log) {
+- pr_err("io-pgtable don't realize sync dirty log\n");
+- return -ENODEV;
+- }
+-
+- /*
+- * Flush iotlb to ensure all inflight transactions are completed.
+- * See doc IHI0070Da 3.13.4 "HTTU behavior summary".
+- */
+- arm_smmu_flush_iotlb_all(domain);
+- return ops->sync_dirty_log(ops, iova, size, bitmap, base_iova,
+- bitmap_pgshift);
+-}
+-
+-static int arm_smmu_clear_dirty_log(struct iommu_domain *domain,
+- unsigned long iova, size_t size,
+- unsigned long *bitmap,
+- unsigned long base_iova,
+- unsigned long bitmap_pgshift)
+-{
+- struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
+- struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops;
+- struct arm_smmu_device *smmu = smmu_domain->smmu;
+-
+- if (!(smmu->features & ARM_SMMU_FEAT_HD))
+- return -ENODEV;
+- if (smmu_domain->stage != ARM_SMMU_DOMAIN_S1)
+- return -EINVAL;
+-
+- if (!ops || !ops->clear_dirty_log) {
+- pr_err("io-pgtable don't realize clear dirty log\n");
+- return -ENODEV;
+- }
+-
+- return ops->clear_dirty_log(ops, iova, size, bitmap, base_iova,
+- bitmap_pgshift);
+-}
+-
+-static int arm_smmu_of_xlate(struct device *dev, struct of_phandle_args *args)
+-{
+- return iommu_fwspec_add_ids(dev, args->args, 1);
+-}
+-
+-static void arm_smmu_get_resv_regions(struct device *dev,
+- struct list_head *head)
+-{
+- struct iommu_resv_region *region;
+- int prot = IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO;
+-
+- region = iommu_alloc_resv_region(MSI_IOVA_BASE, MSI_IOVA_LENGTH,
+- prot, IOMMU_RESV_SW_MSI);
+- if (!region)
+- return;
+-
+- list_add_tail(®ion->list, head);
+-
+- iommu_dma_get_resv_regions(dev, head);
+-}
+-
+-static bool arm_smmu_dev_has_feature(struct device *dev,
+- enum iommu_dev_features feat)
+-{
+- struct arm_smmu_master *master = dev_iommu_priv_get(dev);
+-
+- if (!master)
+- return false;
+-
+- switch (feat) {
+- case IOMMU_DEV_FEAT_IOPF:
+- return arm_smmu_master_iopf_supported(master);
+- case IOMMU_DEV_FEAT_SVA:
+- return arm_smmu_master_sva_supported(master);
+- case IOMMU_DEV_FEAT_AUX:
+- return master->ssid_bits != 0;
+- default:
+- return false;
+- }
+-}
+-
+-static bool arm_smmu_dev_feature_enabled(struct device *dev,
+- enum iommu_dev_features feat)
+-{
+- struct arm_smmu_master *master = dev_iommu_priv_get(dev);
+-
+- if (!master)
+- return false;
+-
+- switch (feat) {
+- case IOMMU_DEV_FEAT_IOPF:
+- return master->iopf_enabled;
+- case IOMMU_DEV_FEAT_SVA:
+- return arm_smmu_master_sva_enabled(master);
+- case IOMMU_DEV_FEAT_AUX:
+- return master->auxd_enabled;
+- default:
+- return false;
+- }
+-}
+-
+-static int arm_smmu_dev_enable_feature(struct device *dev,
+- enum iommu_dev_features feat)
+-{
+- struct arm_smmu_master *master = dev_iommu_priv_get(dev);
+-
+- if (!arm_smmu_dev_has_feature(dev, feat))
++ if (!arm_smmu_dev_has_feature(dev, feat))
+ return -ENODEV;
+
+ if (arm_smmu_dev_feature_enabled(dev, feat))
+@@ -3590,7 +3199,7 @@ static int arm_smmu_aux_attach_dev(struct iommu_domain *domain, struct device *d
+ smmu_domain->smmu = NULL;
+ smmu_domain->ssid = 0;
+ smmu_domain->parent = NULL;
+- ioasid_free(ssid);
++ ioasid_put(ssid);
+ goto out_unlock;
+ }
+ } else if (smmu_domain->parent != parent_smmu_domain) {
+@@ -3662,290 +3271,6 @@ static int arm_smmu_aux_get_pasid(struct iommu_domain *domain, struct device *de
+ return smmu_domain->ssid ?: -EINVAL;
+ }
+
+-static int arm_smmu_set_mpam(struct arm_smmu_device *smmu,
+- int sid, int ssid, int partid, int pmg, int s1mpam)
+-{
+- struct arm_smmu_master *master = arm_smmu_find_master(smmu, sid);
+- struct arm_smmu_domain *domain = master ? master->domain : NULL;
+- u64 val;
+- __le64 *ste, *cd;
+-
+- struct arm_smmu_cmdq_ent prefetch_cmd = {
+- .opcode = CMDQ_OP_PREFETCH_CFG,
+- .prefetch = {
+- .sid = sid,
+- },
+- };
+-
+- if (WARN_ON(!domain))
+- return -EINVAL;
+- if (WARN_ON(domain->stage != ARM_SMMU_DOMAIN_S1))
+- return -EINVAL;
+- if (WARN_ON(ssid >= (1 << domain->s1_cfg.s1cdmax)))
+- return -E2BIG;
+-
+- if (!(smmu->features & ARM_SMMU_FEAT_MPAM))
+- return -ENODEV;
+-
+- if (partid > smmu->mpam_partid_max || pmg > smmu->mpam_pmg_max) {
+- dev_err(smmu->dev,
+- "mpam rmid out of range: partid[0, %d] pmg[0, %d]\n",
+- smmu->mpam_partid_max, smmu->mpam_pmg_max);
+- return -ERANGE;
+- }
+-
+- /* get ste ptr */
+- ste = arm_smmu_get_step_for_sid(smmu, sid);
+-
+- /* write s1mpam to ste */
+- val = le64_to_cpu(ste[1]);
+- val &= ~STRTAB_STE_1_S1MPAM;
+- val |= FIELD_PREP(STRTAB_STE_1_S1MPAM, s1mpam);
+- WRITE_ONCE(ste[1], cpu_to_le64(val));
+-
+- val = le64_to_cpu(ste[4]);
+- val &= ~STRTAB_STE_4_PARTID_MASK;
+- val |= FIELD_PREP(STRTAB_STE_4_PARTID_MASK, partid);
+- WRITE_ONCE(ste[4], cpu_to_le64(val));
+-
+- val = le64_to_cpu(ste[5]);
+- val &= ~STRTAB_STE_5_PMG_MASK;
+- val |= FIELD_PREP(STRTAB_STE_5_PMG_MASK, pmg);
+- WRITE_ONCE(ste[5], cpu_to_le64(val));
+- arm_smmu_sync_ste_for_sid(smmu, sid);
+-
+- /* do not modify cd table which owned by guest */
+- if (domain->stage == ARM_SMMU_DOMAIN_NESTED) {
+- dev_err(smmu->dev,
+- "mpam: smmu cd is owned by guest, not modified\n");
+- return 0;
+- }
+-
+- /* get cd ptr */
+- cd = arm_smmu_get_cd_ptr(domain, ssid);
+- if (s1mpam && WARN_ON(!cd))
+- return -ENOMEM;
+-
+- val = le64_to_cpu(cd[5]);
+- val &= ~CTXDESC_CD_5_PARTID_MASK;
+- val &= ~CTXDESC_CD_5_PMG_MASK;
+- val |= FIELD_PREP(CTXDESC_CD_5_PARTID_MASK, partid);
+- val |= FIELD_PREP(CTXDESC_CD_5_PMG_MASK, pmg);
+- WRITE_ONCE(cd[5], cpu_to_le64(val));
+- arm_smmu_sync_cd(domain, ssid, true);
+-
+- /* It's likely that we'll want to use the new STE soon */
+- if (!(smmu->options & ARM_SMMU_OPT_SKIP_PREFETCH))
+- arm_smmu_cmdq_issue_cmd(smmu, &prefetch_cmd);
+-
+- dev_info(smmu->dev, "partid %d, pmg %d\n", partid, pmg);
+-
+- return 0;
+-}
+-
+-static int arm_smmu_set_dev_user_mpam_en(struct device *dev, int user_mpam_en)
+-{
+- struct arm_smmu_master *master = dev_iommu_priv_get(dev);
+- struct arm_smmu_device *smmu;
+- u32 reg, __iomem *cfg;
+-
+- if (WARN_ON(!master))
+- return -EINVAL;
+-
+- smmu = master->domain->smmu;
+- cfg = smmu->base + ARM_SMMU_USER_CFG0;
+-
+- reg = readl_relaxed(cfg);
+- reg &= ~ARM_SMMU_USER_MPAM_EN;
+- reg |= FIELD_PREP(ARM_SMMU_USER_MPAM_EN, user_mpam_en);
+- writel(reg, cfg);
+- return 0;
+-}
+-
+-static int arm_smmu_device_set_mpam(struct device *dev,
+- struct arm_smmu_mpam *mpam)
+-{
+- struct arm_smmu_master *master = dev_iommu_priv_get(dev);
+- int ret;
+-
+- if (WARN_ON(!master) || WARN_ON(!mpam))
+- return -EINVAL;
+-
+- if (mpam->flags & ARM_SMMU_DEV_SET_MPAM) {
+- ret = arm_smmu_set_mpam(master->domain->smmu,
+- master->streams->id,
+- mpam->pasid,
+- mpam->partid,
+- mpam->pmg,
+- mpam->s1mpam);
+- if (ret < 0)
+- return ret;
+- }
+-
+- if (mpam->flags & ARM_SMMU_DEV_SET_USER_MPAM_EN) {
+- ret = arm_smmu_set_dev_user_mpam_en(dev, mpam->user_mpam_en);
+- if (ret < 0)
+- return ret;
+- }
+-
+- return 0;
+-
+-}
+-
+-static int arm_smmu_get_mpam(struct arm_smmu_device *smmu,
+- int sid, int ssid, int *partid, int *pmg, int *s1mpam)
+-{
+- struct arm_smmu_master *master = arm_smmu_find_master(smmu, sid);
+- struct arm_smmu_domain *domain = master ? master->domain : NULL;
+- u64 val;
+- __le64 *ste, *cd;
+-
+- if (WARN_ON(!domain))
+- return -EINVAL;
+- if (WARN_ON(domain->stage != ARM_SMMU_DOMAIN_S1))
+- return -EINVAL;
+- if (WARN_ON(ssid >= (1 << domain->s1_cfg.s1cdmax)))
+- return -E2BIG;
+-
+- if (!(smmu->features & ARM_SMMU_FEAT_MPAM))
+- return -ENODEV;
+-
+- /* get ste ptr */
+- ste = arm_smmu_get_step_for_sid(smmu, sid);
+-
+- val = le64_to_cpu(ste[4]);
+- *partid = FIELD_GET(STRTAB_STE_4_PARTID_MASK, val);
+-
+- val = le64_to_cpu(ste[5]);
+- *pmg = FIELD_GET(STRTAB_STE_5_PMG_MASK, val);
+-
+- val = le64_to_cpu(ste[1]);
+- *s1mpam = FIELD_GET(STRTAB_STE_1_S1MPAM, val);
+- /* return STE mpam configuration when s1mpam == 0 */
+- if (!(*s1mpam))
+- return 0;
+-
+- /* get cd ptr */
+- cd = arm_smmu_get_cd_ptr(domain, ssid);
+- if (WARN_ON(!cd))
+- return -ENOMEM;
+-
+- val = le64_to_cpu(cd[5]);
+- *partid = FIELD_GET(CTXDESC_CD_5_PARTID_MASK, val);
+- *pmg = FIELD_GET(CTXDESC_CD_5_PMG_MASK, val);
+-
+- return 0;
+-}
+-
+-static int arm_smmu_get_dev_user_mpam_en(struct device *dev, int *user_mpam_en)
+-{
+- struct arm_smmu_master *master = dev_iommu_priv_get(dev);
+- struct arm_smmu_device *smmu;
+- u32 reg;
+-
+- if (WARN_ON(!master))
+- return -EINVAL;
+-
+- smmu = master->domain->smmu;
+-
+- reg = readl_relaxed(smmu->base + ARM_SMMU_USER_CFG0);
+- *user_mpam_en = FIELD_GET(ARM_SMMU_USER_MPAM_EN, reg);
+- return 0;
+-}
+-
+-static int arm_smmu_device_get_mpam(struct device *dev,
+- struct arm_smmu_mpam *mpam)
+-{
+- struct arm_smmu_master *master = dev_iommu_priv_get(dev);
+- int ret;
+-
+- if (WARN_ON(!master) || WARN_ON(!mpam))
+- return -EINVAL;
+-
+- if (mpam->flags & ARM_SMMU_DEV_GET_MPAM) {
+- ret = arm_smmu_get_mpam(master->domain->smmu,
+- master->streams->id,
+- mpam->pasid,
+- &mpam->partid,
+- &mpam->pmg,
+- &mpam->s1mpam);
+- if (ret < 0)
+- return ret;
+- }
+-
+- if (mpam->flags & ARM_SMMU_DEV_GET_USER_MPAM_EN) {
+- ret = arm_smmu_get_dev_user_mpam_en(dev, &mpam->user_mpam_en);
+- if (ret < 0)
+- return ret;
+- }
+-
+- return 0;
+-}
+-
+-static int arm_smmu_device_get_config(struct device *dev, int type, void *data)
+-{
+- switch (type) {
+- case ARM_SMMU_MPAM:
+- return arm_smmu_device_get_mpam(dev, data);
+- default:
+- return -EINVAL;
+- }
+-}
+-
+-static int arm_smmu_device_set_config(struct device *dev, int type, void *data)
+-{
+- switch (type) {
+- case ARM_SMMU_MPAM:
+- return arm_smmu_device_set_mpam(dev, data);
+- default:
+- return -EINVAL;
+- }
+-}
+-
+-/*
+- * HiSilicon PCIe tune and trace device can be used to trace TLP headers on the
+- * PCIe link and save the data to memory by DMA. The hardware is restricted to
+- * use identity mapping only.
+- */
+-#define IS_HISI_PTT_DEVICE(pdev) ((pdev)->vendor == PCI_VENDOR_ID_HUAWEI && \
+- (pdev)->device == 0xa12e)
+-
+-#ifdef CONFIG_SMMU_BYPASS_DEV
+-static int arm_smmu_bypass_dev_domain_type(struct device *dev)
+-{
+- int i;
+- struct pci_dev *pdev = to_pci_dev(dev);
+-
+- for (i = 0; i < smmu_bypass_devices_num; i++) {
+- if ((smmu_bypass_devices[i].vendor == pdev->vendor) &&
+- (smmu_bypass_devices[i].device == pdev->device)) {
+- dev_info(dev, "device 0x%hx:0x%hx uses identity mapping.",
+- pdev->vendor, pdev->device);
+- return IOMMU_DOMAIN_IDENTITY;
+- }
+- }
+-
+- return 0;
+-}
+-#endif
+-
+-static int arm_smmu_def_domain_type(struct device *dev)
+-{
+- int ret = 0;
+-
+- if (dev_is_pci(dev)) {
+- struct pci_dev *pdev = to_pci_dev(dev);
+-
+- if (IS_HISI_PTT_DEVICE(pdev))
+- return IOMMU_DOMAIN_IDENTITY;
+- #ifdef CONFIG_SMMU_BYPASS_DEV
+- ret = arm_smmu_bypass_dev_domain_type(dev);
+- #endif
+- }
+-
+- return ret;
+-}
+-
+ static struct iommu_ops arm_smmu_ops = {
+ .capable = arm_smmu_capable,
+ .domain_alloc = arm_smmu_domain_alloc,
+@@ -3954,6 +3279,7 @@ static struct iommu_ops arm_smmu_ops = {
+ .map = arm_smmu_map,
+ .unmap = arm_smmu_unmap,
+ .flush_iotlb_all = arm_smmu_flush_iotlb_all,
++ .inv_iotlb_range = arm_smmu_sva_mm_invalidate_range,
+ .iotlb_sync = arm_smmu_iotlb_sync,
+ .iova_to_phys = arm_smmu_iova_to_phys,
+ .probe_device = arm_smmu_probe_device,
+@@ -3961,10 +3287,6 @@ static struct iommu_ops arm_smmu_ops = {
+ .device_group = arm_smmu_device_group,
+ .domain_get_attr = arm_smmu_domain_get_attr,
+ .domain_set_attr = arm_smmu_domain_set_attr,
+- .support_dirty_log = arm_smmu_support_dirty_log,
+- .switch_dirty_log = arm_smmu_switch_dirty_log,
+- .sync_dirty_log = arm_smmu_sync_dirty_log,
+- .clear_dirty_log = arm_smmu_clear_dirty_log,
+ .of_xlate = arm_smmu_of_xlate,
+ .get_resv_regions = arm_smmu_get_resv_regions,
+ .put_resv_regions = generic_iommu_put_resv_regions,
+@@ -3976,12 +3298,9 @@ static struct iommu_ops arm_smmu_ops = {
+ .sva_unbind = arm_smmu_sva_unbind,
+ .sva_get_pasid = arm_smmu_sva_get_pasid,
+ .page_response = arm_smmu_page_response,
+- .def_domain_type = arm_smmu_def_domain_type,
+ .aux_attach_dev = arm_smmu_aux_attach_dev,
+ .aux_detach_dev = arm_smmu_aux_detach_dev,
+ .aux_get_pasid = arm_smmu_aux_get_pasid,
+- .dev_get_config = arm_smmu_device_get_config,
+- .dev_set_config = arm_smmu_device_set_config,
+ .pgsize_bitmap = -1UL, /* Restricted during device attach */
+ };
+
+@@ -4042,7 +3361,6 @@ static int arm_smmu_cmdq_init(struct arm_smmu_device *smmu)
+ unsigned int nents = 1 << cmdq->q.llq.max_n_shift;
+ atomic_long_t *bitmap;
+
+- cmdq->shared = 1;
+ atomic_set(&cmdq->owner_prod, 0);
+ atomic_set(&cmdq->lock, 0);
+
+@@ -4058,20 +3376,6 @@ static int arm_smmu_cmdq_init(struct arm_smmu_device *smmu)
+ return ret;
+ }
+
+-static int arm_smmu_ecmdq_init(struct arm_smmu_cmdq *cmdq)
+-{
+- unsigned int nents = 1 << cmdq->q.llq.max_n_shift;
+-
+- atomic_set(&cmdq->owner_prod, 0);
+- atomic_set(&cmdq->lock, 0);
+-
+- cmdq->valid_map = (atomic_long_t *)bitmap_zalloc(nents, GFP_KERNEL);
+- if (!cmdq->valid_map)
+- return -ENOMEM;
+-
+- return 0;
+-}
+-
+ static int arm_smmu_init_queues(struct arm_smmu_device *smmu)
+ {
+ int ret;
+@@ -4140,58 +3444,12 @@ static int arm_smmu_init_l1_strtab(struct arm_smmu_device *smmu)
+ return 0;
+ }
+
+-#ifdef CONFIG_SMMU_BYPASS_DEV
+-static void arm_smmu_install_bypass_ste_for_dev(struct arm_smmu_device *smmu,
+- u32 sid)
+-{
+- u64 val;
+- __le64 *step = arm_smmu_get_step_for_sid(smmu, sid);
+-
+- if (!step)
+- return;
+-
+- val = STRTAB_STE_0_V;
+- val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_BYPASS);
+- step[0] = cpu_to_le64(val);
+- step[1] = cpu_to_le64(FIELD_PREP(STRTAB_STE_1_SHCFG,
+- STRTAB_STE_1_SHCFG_INCOMING));
+- step[2] = 0;
+-}
+-
+-static int arm_smmu_prepare_init_l2_strtab(struct device *dev, void *data)
+-{
+- u32 sid;
+- int ret;
+- struct pci_dev *pdev;
+- struct arm_smmu_device *smmu = (struct arm_smmu_device *)data;
+-
+- if (!arm_smmu_def_domain_type(dev))
+- return 0;
+-
+- pdev = to_pci_dev(dev);
+- sid = PCI_DEVID(pdev->bus->number, pdev->devfn);
+- if (!arm_smmu_sid_in_range(smmu, sid))
+- return -ERANGE;
+-
+- ret = arm_smmu_init_l2_strtab(smmu, sid);
+- if (ret)
+- return ret;
+-
+- arm_smmu_install_bypass_ste_for_dev(smmu, sid);
+-
+- return 0;
+-}
+-#endif
+-
+ static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu)
+ {
+ void *strtab;
+ u64 reg;
+ u32 size, l1size;
+ struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
+-#ifdef CONFIG_SMMU_BYPASS_DEV
+- int ret;
+-#endif
+
+ /* Calculate the L1 size, capped to the SIDSIZE. */
+ size = STRTAB_L1_SZ_SHIFT - (ilog2(STRTAB_L1_DESC_DWORDS) + 3);
+@@ -4220,20 +3478,8 @@ static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu)
+ reg |= FIELD_PREP(STRTAB_BASE_CFG_LOG2SIZE, size);
+ reg |= FIELD_PREP(STRTAB_BASE_CFG_SPLIT, STRTAB_SPLIT);
+ cfg->strtab_base_cfg = reg;
+-#ifdef CONFIG_SMMU_BYPASS_DEV
+- ret = arm_smmu_init_l1_strtab(smmu);
+- if (ret)
+- return ret;
+-
+- if (smmu_bypass_devices_num) {
+- ret = bus_for_each_dev(&pci_bus_type, NULL, (void *)smmu,
+- arm_smmu_prepare_init_l2_strtab);
+- }
+
+- return ret;
+-#else
+ return arm_smmu_init_l1_strtab(smmu);
+-#endif
+ }
+
+ static int arm_smmu_init_strtab_linear(struct arm_smmu_device *smmu)
+@@ -4333,6 +3579,7 @@ static int arm_smmu_update_gbpa(struct arm_smmu_device *smmu, u32 set, u32 clr)
+ return ret;
+ }
+
++#ifdef CONFIG_ACPI
+ static void arm_smmu_free_msis(void *data)
+ {
+ struct device *dev = data;
+@@ -4349,13 +3596,6 @@ static void arm_smmu_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg)
+ doorbell = (((u64)msg->address_hi) << 32) | msg->address_lo;
+ doorbell &= MSI_CFG0_ADDR_MASK;
+
+-#ifdef CONFIG_ARM_SMMU_V3_PM
+- /* Saves the msg (base addr of msi irq) and restores it during resume */
+- desc->msg.address_lo = msg->address_lo;
+- desc->msg.address_hi = msg->address_hi;
+- desc->msg.data = msg->data;
+-#endif
+-
+ writeq_relaxed(doorbell, smmu->base + cfg[0]);
+ writel_relaxed(msg->data, smmu->base + cfg[1]);
+ writel_relaxed(ARM_SMMU_MEMATTR_DEVICE_nGnRE, smmu->base + cfg[2]);
+@@ -4410,53 +3650,14 @@ static void arm_smmu_setup_msis(struct arm_smmu_device *smmu)
+ /* Add callback to free MSIs on teardown */
+ devm_add_action(dev, arm_smmu_free_msis, dev);
+ }
+-
+-#ifdef CONFIG_ARM_SMMU_V3_PM
+-static void arm_smmu_resume_msis(struct arm_smmu_device *smmu)
+-{
+- struct msi_desc *desc;
+- struct device *dev = smmu->dev;
+-
+- for_each_msi_entry(desc, dev) {
+- switch (desc->platform.msi_index) {
+- case EVTQ_MSI_INDEX:
+- case GERROR_MSI_INDEX:
+- case PRIQ_MSI_INDEX: {
+- phys_addr_t *cfg = arm_smmu_msi_cfg[desc->platform.msi_index];
+- struct msi_msg *msg = &desc->msg;
+- phys_addr_t doorbell = (((u64)msg->address_hi) << 32) | msg->address_lo;
+-
+- doorbell &= MSI_CFG0_ADDR_MASK;
+- writeq_relaxed(doorbell, smmu->base + cfg[0]);
+- writel_relaxed(msg->data, smmu->base + cfg[1]);
+- writel_relaxed(ARM_SMMU_MEMATTR_DEVICE_nGnRE,
+- smmu->base + cfg[2]);
+- break;
+- }
+- default:
+- continue;
+-
+- }
+- }
+-}
+-#else
+-static void arm_smmu_resume_msis(struct arm_smmu_device *smmu)
+-{
+-}
+ #endif
+
+-static void arm_smmu_setup_unique_irqs(struct arm_smmu_device *smmu, bool resume)
++static void arm_smmu_setup_unique_irqs(struct arm_smmu_device *smmu)
+ {
+ int irq, ret;
+-
+- if (!resume)
+- arm_smmu_setup_msis(smmu);
+- else {
+- /* The irq doesn't need to be re-requested during resume */
+- arm_smmu_resume_msis(smmu);
+- return;
+- }
+-
++#ifdef CONFIG_ACPI
++ arm_smmu_setup_msis(smmu);
++#endif
+ /* Request interrupt lines */
+ irq = smmu->evtq.q.irq;
+ if (irq) {
+@@ -4497,7 +3698,7 @@ static void arm_smmu_setup_unique_irqs(struct arm_smmu_device *smmu, bool resume
+ }
+ }
+
+-static int arm_smmu_setup_irqs(struct arm_smmu_device *smmu, bool resume)
++static int arm_smmu_setup_irqs(struct arm_smmu_device *smmu, bool for_suspend)
+ {
+ int ret, irq;
+ u32 irqen_flags = IRQ_CTRL_EVTQ_IRQEN | IRQ_CTRL_GERROR_IRQEN;
+@@ -4510,6 +3711,9 @@ static int arm_smmu_setup_irqs(struct arm_smmu_device *smmu, bool resume)
+ return ret;
+ }
+
++ if (for_suspend)
++ goto irq_requested;
++
+ irq = smmu->combined_irq;
+ if (irq) {
+ /*
+@@ -4524,17 +3728,20 @@ static int arm_smmu_setup_irqs(struct arm_smmu_device *smmu, bool resume)
+ if (ret < 0)
+ dev_warn(smmu->dev, "failed to enable combined irq\n");
+ } else
+- arm_smmu_setup_unique_irqs(smmu, resume);
++ arm_smmu_setup_unique_irqs(smmu);
+
+ if (smmu->features & ARM_SMMU_FEAT_PRI)
+ irqen_flags |= IRQ_CTRL_PRIQ_IRQEN;
+-
++irq_requested:
+ /* Enable interrupt generation on the SMMU */
+ ret = arm_smmu_write_reg_sync(smmu, irqen_flags,
+ ARM_SMMU_IRQ_CTRL, ARM_SMMU_IRQ_CTRLACK);
+ if (ret)
+ dev_warn(smmu->dev, "failed to enable irqs\n");
+
++ writel_relaxed(VENDOR_VAL_MASK, smmu->base + SMMU_IRPT_CLR_NS);
++ writel_relaxed(TCU_EVENT_TO_MASK, smmu->base + SMMU_IRPT_MASK_NS);
++
+ return 0;
+ }
+
+@@ -4549,49 +3756,7 @@ static int arm_smmu_device_disable(struct arm_smmu_device *smmu)
+ return ret;
+ }
+
+-static int arm_smmu_ecmdq_reset(struct arm_smmu_device *smmu)
+-{
+- int i, cpu, ret = 0;
+- u32 reg;
+-
+- if (!smmu->nr_ecmdq)
+- return 0;
+-
+- i = 0;
+- for_each_possible_cpu(cpu) {
+- struct arm_smmu_ecmdq *ecmdq;
+- struct arm_smmu_queue *q;
+-
+- ecmdq = *per_cpu_ptr(smmu->ecmdqs, cpu);
+- if (ecmdq != per_cpu_ptr(smmu->ecmdq, cpu))
+- continue;
+-
+- q = &ecmdq->cmdq.q;
+- i++;
+-
+- if (WARN_ON(q->llq.prod != q->llq.cons)) {
+- q->llq.prod = 0;
+- q->llq.cons = 0;
+- }
+- writeq_relaxed(q->q_base, ecmdq->base + ARM_SMMU_ECMDQ_BASE);
+- writel_relaxed(q->llq.prod, ecmdq->base + ARM_SMMU_ECMDQ_PROD);
+- writel_relaxed(q->llq.cons, ecmdq->base + ARM_SMMU_ECMDQ_CONS);
+-
+- /* enable ecmdq */
+- writel(ECMDQ_PROD_EN | q->llq.prod, q->prod_reg);
+- ret = readl_relaxed_poll_timeout(q->cons_reg, reg, reg & ECMDQ_CONS_ENACK,
+- 1, ARM_SMMU_POLL_TIMEOUT_US);
+- if (ret) {
+- dev_err(smmu->dev, "ecmdq[%d] enable failed\n", i);
+- smmu->ecmdq_enabled = 0;
+- break;
+- }
+- }
+-
+- return ret;
+-}
+-
+-static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool resume)
++static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool for_suspend)
+ {
+ int ret;
+ u32 reg, enables;
+@@ -4640,8 +3805,6 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool resume)
+ writel_relaxed(smmu->cmdq.q.llq.prod, smmu->base + ARM_SMMU_CMDQ_PROD);
+ writel_relaxed(smmu->cmdq.q.llq.cons, smmu->base + ARM_SMMU_CMDQ_CONS);
+
+- arm_smmu_ecmdq_reset(smmu);
+-
+ enables = CR0_CMDQEN;
+ ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
+ ARM_SMMU_CR0ACK);
+@@ -4652,16 +3815,18 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool resume)
+
+ /* Invalidate any cached configuration */
+ cmd.opcode = CMDQ_OP_CFGI_ALL;
+- arm_smmu_cmdq_issue_cmd_with_sync(smmu, &cmd);
++ arm_smmu_cmdq_issue_cmd(smmu, &cmd);
++ arm_smmu_cmdq_issue_sync(smmu);
+
+ /* Invalidate any stale TLB entries */
+ if (smmu->features & ARM_SMMU_FEAT_HYP) {
+ cmd.opcode = CMDQ_OP_TLBI_EL2_ALL;
+- arm_smmu_cmdq_issue_cmd_with_sync(smmu, &cmd);
++ arm_smmu_cmdq_issue_cmd(smmu, &cmd);
+ }
+
+ cmd.opcode = CMDQ_OP_TLBI_NSNH_ALL;
+- arm_smmu_cmdq_issue_cmd_with_sync(smmu, &cmd);
++ arm_smmu_cmdq_issue_cmd(smmu, &cmd);
++ arm_smmu_cmdq_issue_sync(smmu);
+
+ /* Event queue */
+ writeq_relaxed(smmu->evtq.q.q_base, smmu->base + ARM_SMMU_EVTQ_BASE);
+@@ -4672,263 +3837,60 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool resume)
+ ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
+ ARM_SMMU_CR0ACK);
+ if (ret) {
+- dev_err(smmu->dev, "failed to enable event queue\n");
+- return ret;
+- }
+-
+- /* PRI queue */
+- if (smmu->features & ARM_SMMU_FEAT_PRI) {
+- writeq_relaxed(smmu->priq.q.q_base,
+- smmu->base + ARM_SMMU_PRIQ_BASE);
+- writel_relaxed(smmu->priq.q.llq.prod,
+- smmu->page1 + ARM_SMMU_PRIQ_PROD);
+- writel_relaxed(smmu->priq.q.llq.cons,
+- smmu->page1 + ARM_SMMU_PRIQ_CONS);
+-
+- enables |= CR0_PRIQEN;
+- ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
+- ARM_SMMU_CR0ACK);
+- if (ret) {
+- dev_err(smmu->dev, "failed to enable PRI queue\n");
+- return ret;
+- }
+- }
+-
+- if (smmu->features & ARM_SMMU_FEAT_ATS) {
+- enables |= CR0_ATSCHK;
+- ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
+- ARM_SMMU_CR0ACK);
+- if (ret) {
+- dev_err(smmu->dev, "failed to enable ATS check\n");
+- return ret;
+- }
+- }
+-
+- ret = arm_smmu_setup_irqs(smmu, resume);
+- if (ret) {
+- dev_err(smmu->dev, "failed to setup irqs\n");
+- return ret;
+- }
+-
+- if (is_kdump_kernel())
+- enables &= ~(CR0_EVTQEN | CR0_PRIQEN);
+-
+- /* Enable the SMMU interface, or ensure bypass */
+- if (!smmu->bypass || disable_bypass) {
+- enables |= CR0_SMMUEN;
+- } else {
+- ret = arm_smmu_update_gbpa(smmu, 0, GBPA_ABORT);
+- if (ret)
+- return ret;
+- }
+- ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
+- ARM_SMMU_CR0ACK);
+- if (ret) {
+- dev_err(smmu->dev, "failed to enable SMMU interface\n");
+- return ret;
+- }
+-
+- return 0;
+-}
+-
+-static int arm_smmu_ecmdq_layout(struct arm_smmu_device *smmu)
+-{
+- int cpu, node, nr_remain, nr_nodes = 0;
+- int *nr_ecmdqs;
+- struct arm_smmu_ecmdq *ecmdq, **ecmdqs;
+-
+- ecmdq = devm_alloc_percpu(smmu->dev, *ecmdq);
+- if (!ecmdq)
+- return -ENOMEM;
+- smmu->ecmdq = ecmdq;
+-
+- if (num_possible_cpus() <= smmu->nr_ecmdq) {
+- for_each_possible_cpu(cpu)
+- *per_cpu_ptr(smmu->ecmdqs, cpu) = per_cpu_ptr(ecmdq, cpu);
+-
+- /* A core requires at most one ECMDQ */
+- smmu->nr_ecmdq = num_possible_cpus();
+-
+- return 0;
+- }
+-
+- for_each_node(node)
+- if (nr_cpus_node(node))
+- nr_nodes++;
+-
+- if (nr_nodes >= smmu->nr_ecmdq) {
+- dev_err(smmu->dev, "%d ECMDQs is less than %d nodes\n", smmu->nr_ecmdq, nr_nodes);
+- return -ENOSPC;
+- }
+-
+- nr_ecmdqs = kcalloc(MAX_NUMNODES, sizeof(int), GFP_KERNEL);
+- if (!nr_ecmdqs)
+- return -ENOMEM;
+-
+- ecmdqs = kcalloc(smmu->nr_ecmdq, sizeof(*ecmdqs), GFP_KERNEL);
+- if (!ecmdqs) {
+- kfree(nr_ecmdqs);
+- return -ENOMEM;
+- }
+-
+- /* [1] Ensure that each node has at least one ECMDQ */
+- nr_remain = smmu->nr_ecmdq - nr_nodes;
+- for_each_node(node) {
+- /*
+- * Calculate the number of ECMDQs to be allocated to this node.
+- * NR_ECMDQS_PER_CPU = nr_remain / num_possible_cpus();
+- * When nr_cpus_node(node) is not zero, less than one ECMDQ
+- * may be left due to truncation rounding.
+- */
+- nr_ecmdqs[node] = nr_cpus_node(node) * nr_remain / num_possible_cpus();
+- }
+-
+- for_each_node(node) {
+- if (!nr_cpus_node(node))
+- continue;
+-
+- nr_remain -= nr_ecmdqs[node];
+-
+- /* An ECMDQ has been reserved for each node at above [1] */
+- nr_ecmdqs[node]++;
+- }
+-
+- /* Divide the remaining ECMDQs */
+- while (nr_remain) {
+- for_each_node(node) {
+- if (!nr_remain)
+- break;
+-
+- if (nr_ecmdqs[node] >= nr_cpus_node(node))
+- continue;
+-
+- nr_ecmdqs[node]++;
+- nr_remain--;
+- }
+- }
+-
+- for_each_node(node) {
+- int i, round, shared;
+-
+- if (!nr_cpus_node(node))
+- continue;
+-
+- shared = 0;
+- if (nr_ecmdqs[node] < nr_cpus_node(node))
+- shared = 1;
+-
+- i = 0;
+- for_each_cpu(cpu, cpumask_of_node(node)) {
+- round = i % nr_ecmdqs[node];
+- if (i++ < nr_ecmdqs[node])
+- ecmdqs[round] = per_cpu_ptr(ecmdq, cpu);
+- else
+- ecmdqs[round]->cmdq.shared = shared;
+- *per_cpu_ptr(smmu->ecmdqs, cpu) = ecmdqs[round];
+- }
+- }
+-
+- kfree(nr_ecmdqs);
+- kfree(ecmdqs);
+-
+- return 0;
+-}
+-
+-static int arm_smmu_ecmdq_probe(struct arm_smmu_device *smmu)
+-{
+- int ret, cpu;
+- u32 i, nump, numq, gap;
+- u32 reg, shift_increment;
+- u64 addr, smmu_dma_base;
+- void __iomem *cp_regs, *cp_base;
+-
+- /* IDR6 */
+- reg = readl_relaxed(smmu->base + ARM_SMMU_IDR6);
+- nump = 1 << FIELD_GET(IDR6_LOG2NUMP, reg);
+- numq = 1 << FIELD_GET(IDR6_LOG2NUMQ, reg);
+- smmu->nr_ecmdq = nump * numq;
+- gap = ECMDQ_CP_RRESET_SIZE >> FIELD_GET(IDR6_LOG2NUMQ, reg);
+- if (!smmu->nr_ecmdq)
+- return -EOPNOTSUPP;
+-
+- smmu_dma_base = (vmalloc_to_pfn(smmu->base) << PAGE_SHIFT);
+- cp_regs = ioremap(smmu_dma_base + ARM_SMMU_ECMDQ_CP_BASE, PAGE_SIZE);
+- if (!cp_regs)
+- return -ENOMEM;
++ dev_err(smmu->dev, "failed to enable event queue\n");
++ return ret;
++ }
+
+- for (i = 0; i < nump; i++) {
+- u64 val, pre_addr;
++ /* PRI queue */
++ if (smmu->features & ARM_SMMU_FEAT_PRI) {
++ writeq_relaxed(smmu->priq.q.q_base,
++ smmu->base + ARM_SMMU_PRIQ_BASE);
++ writel_relaxed(smmu->priq.q.llq.prod,
++ smmu->page1 + ARM_SMMU_PRIQ_PROD);
++ writel_relaxed(smmu->priq.q.llq.cons,
++ smmu->page1 + ARM_SMMU_PRIQ_CONS);
+
+- val = readq_relaxed(cp_regs + 32 * i);
+- if (!(val & ECMDQ_CP_PRESET)) {
+- iounmap(cp_regs);
+- dev_err(smmu->dev, "ecmdq control page %u is memory mode\n", i);
+- return -EFAULT;
++ enables |= CR0_PRIQEN;
++ ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
++ ARM_SMMU_CR0ACK);
++ if (ret) {
++ dev_err(smmu->dev, "failed to enable PRI queue\n");
++ return ret;
+ }
++ }
+
+- if (i && ((val & ECMDQ_CP_ADDR) != (pre_addr + ECMDQ_CP_RRESET_SIZE))) {
+- iounmap(cp_regs);
+- dev_err(smmu->dev, "ecmdq_cp memory region is not contiguous\n");
+- return -EFAULT;
++ if (smmu->features & ARM_SMMU_FEAT_ATS) {
++ enables |= CR0_ATSCHK;
++ ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
++ ARM_SMMU_CR0ACK);
++ if (ret) {
++ dev_err(smmu->dev, "failed to enable ATS check\n");
++ return ret;
+ }
+-
+- pre_addr = val & ECMDQ_CP_ADDR;
+ }
+
+- addr = readl_relaxed(cp_regs) & ECMDQ_CP_ADDR;
+- iounmap(cp_regs);
+-
+- cp_base = devm_ioremap(smmu->dev, smmu_dma_base + addr, ECMDQ_CP_RRESET_SIZE * nump);
+- if (!cp_base)
+- return -ENOMEM;
+-
+- smmu->ecmdqs = devm_alloc_percpu(smmu->dev, struct arm_smmu_ecmdq *);
+- if (!smmu->ecmdqs)
+- return -ENOMEM;
+-
+- ret = arm_smmu_ecmdq_layout(smmu);
+- if (ret)
++ ret = arm_smmu_setup_irqs(smmu, for_suspend);
++ if (ret) {
++ dev_err(smmu->dev, "failed to setup irqs\n");
+ return ret;
++ }
+
+- shift_increment = order_base_2(num_possible_cpus() / smmu->nr_ecmdq);
+-
+- addr = 0;
+- for_each_possible_cpu(cpu) {
+- struct arm_smmu_ecmdq *ecmdq;
+- struct arm_smmu_queue *q;
+-
+- ecmdq = *per_cpu_ptr(smmu->ecmdqs, cpu);
+- q = &ecmdq->cmdq.q;
+-
+- /*
+- * The boot option "maxcpus=" can limit the number of online
+- * CPUs. The CPUs that are not selected are not showed in
+- * cpumask_of_node(node), their 'ecmdq' may be NULL.
+- *
+- * (ecmdq != per_cpu_ptr(smmu->ecmdq, cpu)) indicates that the
+- * ECMDQ is shared by multiple cores and should be initialized
+- * only by the first owner.
+- */
+- if (!ecmdq || (ecmdq != per_cpu_ptr(smmu->ecmdq, cpu)))
+- continue;
+- ecmdq->base = cp_base + addr;
++ if (is_kdump_kernel())
++ enables &= ~(CR0_EVTQEN | CR0_PRIQEN);
+
+- q->llq.max_n_shift = ECMDQ_MAX_SZ_SHIFT + shift_increment;
+- ret = arm_smmu_init_one_queue(smmu, q, ecmdq->base, ARM_SMMU_ECMDQ_PROD,
+- ARM_SMMU_ECMDQ_CONS, CMDQ_ENT_DWORDS, "ecmdq");
++ /* Enable the SMMU interface, or ensure bypass */
++ if (!smmu->bypass || disable_bypass) {
++ enables |= CR0_SMMUEN;
++ } else {
++ ret = arm_smmu_update_gbpa(smmu, 0, GBPA_ABORT);
+ if (ret)
+ return ret;
+-
+- q->ecmdq_prod = ECMDQ_PROD_EN;
+- rwlock_init(&q->ecmdq_lock);
+-
+- ret = arm_smmu_ecmdq_init(&ecmdq->cmdq);
+- if (ret) {
+- dev_err(smmu->dev, "ecmdq[%d] init failed\n", i);
+- return ret;
+- }
+-
+- addr += gap;
++ }
++ ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
++ ARM_SMMU_CR0ACK);
++ if (ret) {
++ dev_err(smmu->dev, "failed to enable SMMU interface\n");
++ return ret;
+ }
+
+ return 0;
+@@ -4965,12 +3927,14 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
+ /* IDR0 */
+ reg = readl_relaxed(smmu->base + ARM_SMMU_IDR0);
+
++#ifndef CONFIG_VENDOR_NPU
+ /* 2-level structures */
+ if (FIELD_GET(IDR0_ST_LVL, reg) == IDR0_ST_LVL_2LVL)
+ smmu->features |= ARM_SMMU_FEAT_2_LVL_STRTAB;
+
+ if (reg & IDR0_CD2L)
+ smmu->features |= ARM_SMMU_FEAT_2_LVL_CDTAB;
++#endif
+
+ /*
+ * Translation table endianness.
+@@ -5078,9 +4042,6 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
+ return -ENXIO;
+ }
+
+- if (reg & IDR1_ECMDQ)
+- smmu->features |= ARM_SMMU_FEAT_ECMDQ;
+-
+ /* Queue sizes, capped to ensure natural alignment */
+ smmu->cmdq.q.llq.max_n_shift = min_t(u32, CMDQ_MAX_SZ_SHIFT,
+ FIELD_GET(IDR1_CMDQS, reg));
+@@ -5104,6 +4065,8 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
+ /* SID/SSID sizes */
+ smmu->ssid_bits = FIELD_GET(IDR1_SSIDSIZE, reg);
+ smmu->sid_bits = FIELD_GET(IDR1_SIDSIZE, reg);
++ smmu->sid_bits = 6; /* set sid to 6 bits */
++ smmu->ssid_bits = 6; /* set ssid to 6 bits */
+
+ /*
+ * If the SMMU supports fewer bits than would fill a single L2 stream
+@@ -5114,31 +4077,9 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
+
+ /* IDR3 */
+ reg = readl_relaxed(smmu->base + ARM_SMMU_IDR3);
+- switch (FIELD_GET(IDR3_BBML, reg)) {
+- case IDR3_BBML0:
+- break;
+- case IDR3_BBML1:
+- smmu->features |= ARM_SMMU_FEAT_BBML1;
+- break;
+- case IDR3_BBML2:
+- smmu->features |= ARM_SMMU_FEAT_BBML2;
+- break;
+- default:
+- dev_err(smmu->dev, "unknown/unsupported BBM behavior level\n");
+- return -ENXIO;
+- }
+-
+ if (FIELD_GET(IDR3_RIL, reg))
+ smmu->features |= ARM_SMMU_FEAT_RANGE_INV;
+
+- if (reg & IDR3_MPAM) {
+- reg = readl_relaxed(smmu->base + ARM_SMMU_MPAMIDR);
+- smmu->mpam_partid_max = FIELD_GET(MPAMIDR_PARTID_MAX, reg);
+- smmu->mpam_pmg_max = FIELD_GET(MPAMIDR_PMG_MAX, reg);
+- if (smmu->mpam_partid_max || smmu->mpam_pmg_max)
+- smmu->features |= ARM_SMMU_FEAT_MPAM;
+- }
+-
+ /* IDR5 */
+ reg = readl_relaxed(smmu->base + ARM_SMMU_IDR5);
+
+@@ -5201,18 +4142,11 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
+ if (arm_smmu_sva_supported(smmu))
+ smmu->features |= ARM_SMMU_FEAT_SVA;
+
++ if (smmu->features & ARM_SMMU_FEAT_SVA)
++ printk("support SVA===================>\n");
++
+ dev_info(smmu->dev, "ias %lu-bit, oas %lu-bit (features 0x%08x)\n",
+ smmu->ias, smmu->oas, smmu->features);
+-
+- if (smmu->features & ARM_SMMU_FEAT_ECMDQ) {
+- int err;
+-
+- err = arm_smmu_ecmdq_probe(smmu);
+- if (err) {
+- dev_err(smmu->dev, "suppress ecmdq feature, errno=%d\n", err);
+- smmu->ecmdq_enabled = 0;
+- }
+- }
+ return 0;
+ }
+
+@@ -5296,6 +4230,59 @@ static unsigned long arm_smmu_resource_size(struct arm_smmu_device *smmu)
+ return SZ_128K;
+ }
+
++#define ARM_SMMMU_DEVICE_MAX 2
++#define ARM_SMMMU_DEVICE_NAME_LEN 64
++struct smmu_dev_wl_mng {
++ char smmu_name[ARM_SMMMU_DEVICE_NAME_LEN];
++ void *pdev;
++ bool is_probe;
++ bool is_poweron;
++};
++
++static struct smmu_dev_wl_mng smmu_dev_white_list[ARM_SMMMU_DEVICE_MAX] = {
++ { "smmu_npu", NULL, false, false},
++#if defined(CONFIG_ARCH_SS000V100)
++ { "smmu_svp_npu", NULL, false, false}
++#elif defined(CONFIG_ARCH_SS928V100)
++ { "smmu_pqp", NULL, false, false}
++#endif
++};
++
++static int smmu_device_wl_process(struct platform_device *pdev)
++{
++ int i;
++
++ for (i = 0; i < ARM_SMMMU_DEVICE_MAX; i++) {
++ if (strnstr(pdev->name, smmu_dev_white_list[i].smmu_name, ARM_SMMMU_DEVICE_NAME_LEN) != NULL) {
++ smmu_dev_white_list[i].pdev = (void *)pdev;
++ return 0;
++ }
++ }
++ return -1;
++}
++
++static int arm_smmu_device_poweron_probe(struct arm_smmu_device *smmu, struct device *dev)
++{
++ int ret;
++
++ /* Probe the h/w */
++ ret = arm_smmu_device_hw_probe(smmu);
++ if (ret)
++ return ret;
++
++ /* Initialise in-memory data structures */
++ ret = arm_smmu_init_structures(smmu);
++ if (ret)
++ return ret;
++
++ /* Reset the device */
++ ret = arm_smmu_device_reset(smmu, false);
++ if (ret)
++ return ret;
++
++ return 0;
++}
++
+ static int arm_smmu_set_bus_ops(struct iommu_ops *ops)
+ {
+ int err;
+@@ -5341,81 +4328,6 @@ static void __iomem *arm_smmu_ioremap(struct device *dev, resource_size_t start,
+ return devm_ioremap_resource(dev, &res);
+ }
+
+-#ifdef CONFIG_ARM_SMMU_V3_PM
+-static int arm_smmu_ecmdq_disable(struct device *dev)
+-{
+- int i, j;
+- int ret, nr_fail = 0, n = 100;
+- u32 reg, prod, cons;
+- struct arm_smmu_ecmdq *ecmdq;
+- struct arm_smmu_queue *q;
+- struct arm_smmu_device *smmu = dev_get_drvdata(dev);
+-
+- for (i = 0; i < smmu->nr_ecmdq; i++) {
+- ecmdq = *per_cpu_ptr(smmu->ecmdqs, i);
+- q = &ecmdq->cmdq.q;
+-
+- prod = readl_relaxed(q->prod_reg);
+- cons = readl_relaxed(q->cons_reg);
+- if ((prod & ECMDQ_PROD_EN) == 0)
+- continue;
+-
+- for (j = 0; j < n; j++) {
+- if (Q_IDX(&q->llq, prod) == Q_IDX(&q->llq, cons) &&
+- Q_WRP(&q->llq, prod) == Q_WRP(&q->llq, cons))
+- break;
+-
+- /* Wait a moment, so ECMDQ has a chance to finish */
+- udelay(1);
+- cons = readl_relaxed(q->cons_reg);
+- }
+- WARN_ON(prod != readl_relaxed(q->prod_reg));
+- if (j >= n)
+- dev_warn(smmu->dev,
+- "Forcibly disabling ecmdq[%d]: prod=%08x, cons=%08x\n",
+- i, prod, cons);
+-
+- /* disable ecmdq */
+- prod &= ~ECMDQ_PROD_EN;
+- writel(prod, q->prod_reg);
+- ret = readl_relaxed_poll_timeout(q->cons_reg, reg, !(reg & ECMDQ_CONS_ENACK),
+- 1, ARM_SMMU_POLL_TIMEOUT_US);
+- if (ret) {
+- nr_fail++;
+- dev_err(smmu->dev, "ecmdq[%d] disable failed\n", i);
+- }
+- }
+-
+- if (nr_fail) {
+- smmu->ecmdq_enabled = 0;
+- pr_warn("Suppress ecmdq feature, switch to normal cmdq\n");
+- return -EIO;
+- }
+-
+- return 0;
+-}
+-
+-static int arm_smmu_suspend(struct device *dev)
+-{
+- arm_smmu_ecmdq_disable(dev);
+-
+- /*
+- * The smmu is powered off and related registers are automatically
+- * cleared when suspend. No need to do anything.
+- */
+- return 0;
+-}
+-
+-static int arm_smmu_resume(struct device *dev)
+-{
+- struct arm_smmu_device *smmu = dev_get_drvdata(dev);
+-
+- arm_smmu_device_reset(smmu, true);
+-
+- return 0;
+-}
+-#endif
+-
+ static int arm_smmu_device_probe(struct platform_device *pdev)
+ {
+ int irq, ret;
+@@ -5444,8 +4356,6 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
+
+ /* Base address */
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+- if (!res)
+- return -EINVAL;
+ if (resource_size(res) < arm_smmu_resource_size(smmu)) {
+ dev_err(dev, "MMIO region too small (%pr)\n", res);
+ return -EINVAL;
+@@ -5456,10 +4366,12 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
+ * Don't map the IMPLEMENTATION DEFINED regions, since they may contain
+ * the PMCG registers which are reserved by the PMU driver.
+ */
+- smmu->base = arm_smmu_ioremap(dev, ioaddr, ARM_SMMU_REG_SZ);
++#ifdef CONFIG_VENDOR_NPU
++ smmu->base = arm_smmu_ioremap(dev, ioaddr, resource_size(res));
+ if (IS_ERR(smmu->base))
+ return PTR_ERR(smmu->base);
+-
++ smmu->page1 = smmu->base + SZ_64K;
++#else
+ if (arm_smmu_resource_size(smmu) > SZ_64K) {
+ smmu->page1 = arm_smmu_ioremap(dev, ioaddr + SZ_64K,
+ ARM_SMMU_REG_SZ);
+@@ -5468,7 +4380,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
+ } else {
+ smmu->page1 = smmu->base;
+ }
+-
++#endif
+ /* Interrupt lines */
+
+ irq = platform_get_irq_byname_optional(pdev, "combined");
+@@ -5487,23 +4399,14 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
+ if (irq > 0)
+ smmu->gerr_irq = irq;
+ }
+- /* Probe the h/w */
+- ret = arm_smmu_device_hw_probe(smmu);
+- if (ret)
+- return ret;
+-
+- /* Initialise in-memory data structures */
+- ret = arm_smmu_init_structures(smmu);
+- if (ret)
+- return ret;
+-
+ /* Record our private device structure */
+ platform_set_drvdata(pdev, smmu);
+
+- /* Reset the device */
+- ret = arm_smmu_device_reset(smmu, false);
+- if (ret)
+- return ret;
++ if (0 != smmu_device_wl_process(pdev)) {
++ ret = arm_smmu_device_poweron_probe(smmu, dev);
++ if (ret)
++ return ret;
++ }
+
+ /* And we're up. Go go go! */
+ ret = iommu_device_sysfs_add(&smmu->iommu, dev, NULL,
+@@ -5523,17 +4426,170 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
+ return arm_smmu_set_bus_ops(&arm_smmu_ops);
+ }
+
++int arm_smmu_device_post_probe(const char *device_name)
++{
++ int ret, i;
++ struct platform_device *pdev = NULL;
++ struct arm_smmu_device *smmu = NULL;
++
++ for (i = 0; i < ARM_SMMMU_DEVICE_MAX; i++) {
++ if (strnstr(device_name, smmu_dev_white_list[i].smmu_name, ARM_SMMMU_DEVICE_NAME_LEN) != NULL) {
++ if (smmu_dev_white_list[i].is_probe == true)
++ return 0;
++
++ pdev = (struct platform_device *)smmu_dev_white_list[i].pdev;
++ break;
++ }
++ }
++
++ if (pdev == NULL) {
++ dev_err(&pdev->dev, "fail to find smmu device in white list \n");
++ return -1;
++ }
++
++ smmu = platform_get_drvdata(pdev);
++ if (smmu == NULL)
++ return -1;
++ ret = arm_smmu_device_poweron_probe(smmu, &pdev->dev);
++ if (ret) {
++ dev_err(&pdev->dev, "Fail to do smmu post probe\n");
++ return ret;
++ }
++ smmu_dev_white_list[i].is_probe = true;
++ smmu_dev_white_list[i].is_poweron = true;
++ return 0;
++}
++
++EXPORT_SYMBOL_GPL(arm_smmu_device_post_probe);
++
++static bool arm_smmu_device_is_in_wl(const char *device_name)
++{
++ int i;
++
++ for (i = 0; i < ARM_SMMMU_DEVICE_MAX; i++) {
++ if (strnstr(device_name, smmu_dev_white_list[i].smmu_name, ARM_SMMMU_DEVICE_NAME_LEN) != NULL)
++ return true;
++ }
++ return false;
++}
++
++#ifndef CONFIG_VENDOR_NPU
++static bool arm_smmu_device_is_poweron(const char *device_name)
++{
++ int i;
++
++ for (i = 0; i < ARM_SMMMU_DEVICE_MAX; i++) {
++ if (strnstr(device_name, smmu_dev_white_list[i].smmu_name, ARM_SMMMU_DEVICE_NAME_LEN) != NULL) {
++ if (smmu_dev_white_list[i].is_probe == true && smmu_dev_white_list[i].is_poweron == true)
++ return true;
++ }
++ }
++ return false;
++}
++#endif
++
++int arm_smmu_device_suspend(const char *device_name)
++{
++ int i;
++
++ for (i = 0; i < ARM_SMMMU_DEVICE_MAX; i++) {
++ if (strnstr(device_name, smmu_dev_white_list[i].smmu_name, ARM_SMMMU_DEVICE_NAME_LEN) != NULL) {
++ smmu_dev_white_list[i].is_poweron = false;
++ return 0;
++ }
++ }
++ return -1;
++}
++EXPORT_SYMBOL_GPL(arm_smmu_device_suspend);
++
++static struct arm_smmu_device *get_smmu_device_data(const char *device_name, int *index)
++{
++ int i;
++ struct platform_device *pdev = NULL;
++ struct arm_smmu_device *smmu = NULL;
++
++ for (i = 0; i < ARM_SMMMU_DEVICE_MAX; i++) {
++ if (strnstr(device_name, smmu_dev_white_list[i].smmu_name, ARM_SMMMU_DEVICE_NAME_LEN) != NULL) {
++ if (smmu_dev_white_list[i].is_probe == false)
++ return 0;
++
++ pdev = (struct platform_device *)smmu_dev_white_list[i].pdev;
++ break;
++ }
++ }
++
++ if (i >= ARM_SMMMU_DEVICE_MAX || pdev == NULL) {
++ dev_err(&pdev->dev, "fail to find smmu device in white list \n");
++ return NULL;
++ }
++
++ *index = i;
++
++ smmu = platform_get_drvdata(pdev);
++ if (smmu == NULL)
++ return NULL;
++
++ return smmu;
++}
++
++int arm_smmu_device_resume(const char *device_name)
++{
++ int ret;
++ int index = 0;
++ struct arm_smmu_device *smmu = NULL;
++
++ smmu = get_smmu_device_data(device_name, &index);
++ if (smmu == NULL)
++ return -1;
++
++ if (index < ARM_SMMMU_DEVICE_MAX)
++ smmu_dev_white_list[index].is_poweron = true;
++
++ ret = arm_smmu_device_reset(smmu, true);
++ return ret;
++}
++EXPORT_SYMBOL_GPL(arm_smmu_device_resume);
++
++int arm_smmu_device_reset_ex(const char *device_name)
++{
++ int ret = -1;
++ int index = 0;
++ struct arm_smmu_device *smmu = NULL;
++
++ smmu = get_smmu_device_data(device_name, &index);
++ if (smmu == NULL)
++ return -1;
++
++ if (index < ARM_SMMMU_DEVICE_MAX && smmu_dev_white_list[index].is_poweron == true)
++ ret = arm_smmu_device_reset(smmu, true);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(arm_smmu_device_reset_ex);
++
++const char *arm_smmu_get_device_name(struct iommu_domain *domain)
++{
++ struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
++ struct arm_smmu_device *smmu = smmu_domain->smmu;
++ return dev_name(smmu->dev);
++}
++EXPORT_SYMBOL_GPL(arm_smmu_get_device_name);
++
++
+ static int arm_smmu_device_remove(struct platform_device *pdev)
+ {
+ struct arm_smmu_device *smmu = platform_get_drvdata(pdev);
++ const char *device_name = dev_name(smmu->dev);
+
++ iopf_queue_free(smmu->evtq.iopf);
++ iopf_queue_free(smmu->priq.iopf);
++ if (arm_smmu_device_is_in_wl(device_name)) {
++ return 0;
++ }
+ arm_smmu_set_bus_ops(NULL);
+ iommu_device_unregister(&smmu->iommu);
+ iommu_device_sysfs_remove(&smmu->iommu);
+ arm_smmu_device_disable(smmu);
+- iopf_queue_free(smmu->evtq.iopf);
+- iopf_queue_free(smmu->priq.iopf);
+-
+ return 0;
+ }
+
+@@ -5548,16 +4604,6 @@ static const struct of_device_id arm_smmu_of_match[] = {
+ };
+ MODULE_DEVICE_TABLE(of, arm_smmu_of_match);
+
+-#ifdef CONFIG_ARM_SMMU_V3_PM
+-static const struct dev_pm_ops arm_smmu_pm_ops = {
+- .suspend = arm_smmu_suspend,
+- .resume = arm_smmu_resume,
+-};
+-#define ARM_SMMU_PM_OPS (&arm_smmu_pm_ops)
+-#else
+-#define ARM_SMMU_PM_OPS NULL
+-#endif
+-
+ static void arm_smmu_driver_unregister(struct platform_driver *drv)
+ {
+ arm_smmu_sva_notifier_synchronize();
+@@ -5569,7 +4615,6 @@ static struct platform_driver arm_smmu_driver = {
+ .name = "arm-smmu-v3",
+ .of_match_table = arm_smmu_of_match,
+ .suppress_bind_attrs = true,
+- .pm = ARM_SMMU_PM_OPS,
+ },
+ .probe = arm_smmu_device_probe,
+ .remove = arm_smmu_device_remove,
+diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h
+index 919473d2217b..15f55092f840 100644
+--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h
++++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h
+@@ -45,7 +45,6 @@
+ #define IDR0_S2P (1 << 0)
+
+ #define ARM_SMMU_IDR1 0x4
+-#define IDR1_ECMDQ (1 << 31)
+ #define IDR1_TABLES_PRESET (1 << 30)
+ #define IDR1_QUEUES_PRESET (1 << 29)
+ #define IDR1_REL (1 << 28)
+@@ -56,13 +55,7 @@
+ #define IDR1_SIDSIZE GENMASK(5, 0)
+
+ #define ARM_SMMU_IDR3 0xc
+-#define IDR3_BBML GENMASK(12, 11)
+-#define IDR3_BBML0 0
+-#define IDR3_BBML1 1
+-#define IDR3_BBML2 2
+ #define IDR3_RIL (1 << 10)
+-#define IDR3_MPAM (1 << 7)
+-#define ARM_SMMU_IDR3_CFG 0x140C
+
+ #define ARM_SMMU_IDR5 0x14
+ #define IDR5_STALL_MAX GENMASK(31, 16)
+@@ -118,7 +111,6 @@
+ #define ARM_SMMU_IRQ_CTRLACK 0x54
+
+ #define ARM_SMMU_GERROR 0x60
+-#define GERROR_CMDQP_ERR (1 << 9)
+ #define GERROR_SFM_ERR (1 << 8)
+ #define GERROR_MSI_GERROR_ABT_ERR (1 << 7)
+ #define GERROR_MSI_PRIQ_ABT_ERR (1 << 6)
+@@ -164,33 +156,6 @@
+ #define ARM_SMMU_PRIQ_IRQ_CFG1 0xd8
+ #define ARM_SMMU_PRIQ_IRQ_CFG2 0xdc
+
+-#define ARM_SMMU_MPAMIDR 0x130
+-#define MPAMIDR_PMG_MAX GENMASK(23, 16)
+-#define MPAMIDR_PARTID_MAX GENMASK(15, 0)
+-
+-#define ARM_SMMU_USER_CFG0 0xe00
+-#define ARM_SMMU_USER_MPAM_EN (1UL << 30)
+-
+-#define ARM_SMMU_IDR6 0x190
+-#define IDR6_LOG2NUMP GENMASK(27, 24)
+-#define IDR6_LOG2NUMQ GENMASK(19, 16)
+-#define IDR6_BA_DOORBELLS GENMASK(9, 0)
+-
+-#define ARM_SMMU_ECMDQ_BASE 0x00
+-#define ARM_SMMU_ECMDQ_PROD 0x08
+-#define ARM_SMMU_ECMDQ_CONS 0x0c
+-#define ECMDQ_MAX_SZ_SHIFT 8
+-#define ECMDQ_PROD_EN (1 << 31)
+-#define ECMDQ_CONS_ENACK (1 << 31)
+-#define ECMDQ_CONS_ERR (1 << 23)
+-#define ECMDQ_PROD_ERRACK (1 << 23)
+-
+-#define ARM_SMMU_ECMDQ_CP_BASE 0x4000
+-#define ECMDQ_CP_ADDR GENMASK_ULL(51, 12)
+-#define ECMDQ_CP_CMDQGS GENMASK_ULL(2, 1)
+-#define ECMDQ_CP_PRESET (1UL << 0)
+-#define ECMDQ_CP_RRESET_SIZE 0x10000
+-
+ #define ARM_SMMU_REG_SZ 0xe00
+
+ /* Common MSI config fields */
+@@ -266,7 +231,6 @@
+ #define STRTAB_STE_1_S1CSH GENMASK_ULL(7, 6)
+
+ #define STRTAB_STE_1_PPAR (1UL << 18)
+-#define STRTAB_STE_1_S1MPAM (1UL << 26)
+ #define STRTAB_STE_1_S1STALLD (1UL << 27)
+
+ #define STRTAB_STE_1_EATS GENMASK_ULL(29, 28)
+@@ -297,11 +261,6 @@
+
+ #define STRTAB_STE_3_S2TTB_MASK GENMASK_ULL(51, 4)
+
+-#define STRTAB_STE_4_PARTID_MASK GENMASK_ULL(31, 16)
+-
+-#define STRTAB_STE_5_MPAM_NS (1UL << 8)
+-#define STRTAB_STE_5_PMG_MASK GENMASK_ULL(7, 0)
+-
+ /*
+ * Context descriptors.
+ *
+@@ -343,9 +302,6 @@
+
+ #define CTXDESC_CD_1_TTB0_MASK GENMASK_ULL(51, 4)
+
+-#define CTXDESC_CD_5_PARTID_MASK GENMASK_ULL(47, 32)
+-#define CTXDESC_CD_5_PMG_MASK GENMASK_ULL(55, 48)
+-
+ /*
+ * When the SMMU only supports linear context descriptor tables, pick a
+ * reasonable size limit (64kB).
+@@ -475,6 +431,25 @@
+ #define MSI_IOVA_BASE 0x8000000
+ #define MSI_IOVA_LENGTH 0x100000
+
++#define VENDOR_TOP_CTL_BASE (0x30000)
++
++#define SMMU_IRPT_MASK_NS (VENDOR_TOP_CTL_BASE + 0x70)
++#define TCU_EVENT_TO_MASK BIT(5)
++#define VENDOR_VAL_MASK 0xffffffff
++
++#define SMMU_IRPT_RAW_NS (VENDOR_TOP_CTL_BASE + 0x74)
++
++#define SMMU_IRPT_STAT_NS (VENDOR_TOP_CTL_BASE + 0x78)
++#define TCU_EVENT_Q_IRQ BIT(0)
++#define TCU_CMD_SYNC_IRQ BIT(1)
++#define TCU_GERROR_IRQ BIT(2)
++
++#define SMMU_IRPT_CLR_NS (VENDOR_TOP_CTL_BASE + 0x7c)
++#define TCU_EVENT_Q_IRQ_CLR BIT(0)
++#define TCU_CMD_SYNC_IRQ_CLR BIT(1)
++#define TCU_GERROR_IRQ_CLR BIT(2)
++#define TCU_EVENTTO_CLR BIT(5)
++
+ struct arm_smmu_cmdq_ent {
+ /* Common fields */
+ u8 opcode;
+@@ -572,8 +547,6 @@ struct arm_smmu_ll_queue {
+ struct arm_smmu_queue {
+ struct arm_smmu_ll_queue llq;
+ int irq; /* Wired interrupt */
+- u32 ecmdq_prod;
+- rwlock_t ecmdq_lock;
+
+ __le64 *base;
+ dma_addr_t base_dma;
+@@ -597,12 +570,6 @@ struct arm_smmu_cmdq {
+ atomic_long_t *valid_map;
+ atomic_t owner_prod;
+ atomic_t lock;
+- int shared;
+-};
+-
+-struct arm_smmu_ecmdq {
+- struct arm_smmu_cmdq cmdq;
+- void __iomem *base;
+ };
+
+ struct arm_smmu_cmdq_batch {
+@@ -703,10 +670,6 @@ struct arm_smmu_device {
+ #define ARM_SMMU_FEAT_E2H (1 << 18)
+ #define ARM_SMMU_FEAT_HA (1 << 19)
+ #define ARM_SMMU_FEAT_HD (1 << 20)
+-#define ARM_SMMU_FEAT_BBML1 (1 << 21)
+-#define ARM_SMMU_FEAT_BBML2 (1 << 22)
+-#define ARM_SMMU_FEAT_ECMDQ (1 << 23)
+-#define ARM_SMMU_FEAT_MPAM (1 << 24)
+ u32 features;
+
+ #define ARM_SMMU_OPT_SKIP_PREFETCH (1 << 0)
+@@ -714,13 +677,6 @@ struct arm_smmu_device {
+ #define ARM_SMMU_OPT_MSIPOLL (1 << 2)
+ u32 options;
+
+- union {
+- u32 nr_ecmdq;
+- u32 ecmdq_enabled;
+- };
+- struct arm_smmu_ecmdq *__percpu *ecmdqs;
+- struct arm_smmu_ecmdq __percpu *ecmdq;
+-
+ struct arm_smmu_cmdq cmdq;
+ struct arm_smmu_evtq evtq;
+ struct arm_smmu_priq priq;
+@@ -749,10 +705,6 @@ struct arm_smmu_device {
+
+ struct rb_root streams;
+ struct mutex streams_mutex;
+-
+- unsigned int mpam_partid_max;
+- unsigned int mpam_pmg_max;
+-
+ bool bypass;
+ };
+
+@@ -828,14 +780,14 @@ extern struct mutex arm_smmu_asid_lock;
+ extern struct arm_smmu_ctx_desc quiet_cd;
+
+ int arm_smmu_write_ctx_desc(struct arm_smmu_domain *smmu_domain, int ssid,
+- struct arm_smmu_ctx_desc *cd);
++ struct arm_smmu_ctx_desc *cd);
+ void arm_smmu_tlb_inv_asid(struct arm_smmu_device *smmu, u16 asid);
+ void arm_smmu_tlb_inv_range_asid(unsigned long iova, size_t size, int asid,
+- size_t granule, bool leaf,
+- struct arm_smmu_domain *smmu_domain);
++ size_t granule, bool leaf,
++ struct arm_smmu_domain *smmu_domain);
+ bool arm_smmu_free_asid(struct arm_smmu_ctx_desc *cd);
+ int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid,
+- unsigned long iova, size_t size);
++ unsigned long iova, size_t size);
+ int arm_smmu_enable_pri(struct arm_smmu_master *master);
+ void arm_smmu_disable_pri(struct arm_smmu_master *master);
+ int arm_smmu_flush_priq(struct arm_smmu_device *smmu);
+@@ -850,10 +802,12 @@ bool arm_smmu_master_iopf_supported(struct arm_smmu_master *master);
+ int arm_smmu_master_enable_iopf(struct arm_smmu_master *master);
+ int arm_smmu_master_disable_iopf(struct arm_smmu_master *master);
+ struct iommu_sva *arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm,
+- void *drvdata);
++ void *drvdata);
+ void arm_smmu_sva_unbind(struct iommu_sva *handle);
+ u32 arm_smmu_sva_get_pasid(struct iommu_sva *handle);
+ void arm_smmu_sva_notifier_synchronize(void);
++void arm_smmu_sva_mm_invalidate_range(struct iommu_domain *domain,
++ struct mm_struct *mm, unsigned long start, unsigned long size);
+ #else /* CONFIG_ARM_SMMU_V3_SVA */
+ static inline bool arm_smmu_sva_supported(struct arm_smmu_device *smmu)
+ {
+diff --git a/drivers/iommu/arm/arm-smmu-v3/ascend_smmu.c b/drivers/iommu/arm/arm-smmu-v3/ascend_smmu.c
+deleted file mode 100644
+index 5e9ed6add9dc..000000000000
+--- a/drivers/iommu/arm/arm-smmu-v3/ascend_smmu.c
++++ /dev/null
+@@ -1,434 +0,0 @@
+-// SPDX-License-Identifier: GPL-2.0+
+-/*
+- * Huawei Ascend accelerator common code for SMMUv3 ATOS feature implementations.
+- *
+- * Copyright (C) 2020-2021 Huawei Technologies Co., Ltd
+- *
+- * Author: Binfeng Wu
+- *
+- * This driver is intended to provide an interface for translating IPA to PA
+- * based on the SMMUv3 ATOS feature.
+- *
+- */
+-
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-
+-#define AGENT_SMMU_IDR1 0x4
+-#define IDR1_SSIDSIZE GENMASK(10, 6)
+-#define IDR1_SIDSIZE GENMASK(5, 0)
+-
+-#define AGENT_SMMU_CR0 0x20
+-#define CR0_SMMUEN (1 << 0)
+-
+-#define AGENT_SMMU_ATOS_CTRL 0x100
+-
+-#define ENHANCED_ATOS_UNIT_ADDR 0x1700 /* first unit */
+-#define ENHANCED_ATOS_UNIT_SIZE 0x18
+-
+-#define ENHANCED_ATOS_SID 0x0
+-#define ENHANCED_ATOS_STREAMID_MASK GENMASK_ULL(31, 0)
+-#define ENHANCED_ATOS_SUBSTREAMID_MASK GENMASK_ULL(51, 32)
+-#define ENHANCED_ATOS_SSID_VALID_MASK GENMASK_ULL(52, 52)
+-
+-#define ENHANCED_ATOS_ADDR 0x8
+-#define ENHANCED_ATOS_ADDR_ADDR_MASK GENMASK_ULL(63, 12)
+-#define ENHANCED_ATOS_ADDR_TYPE_MASK GENMASK_ULL(11, 10)
+-#define ENHANCED_ATOS_ADDR_TYPE_S1 0x01
+-#define ENHANCED_ATOS_ADDR_HTTUI_MASK (1 << 6)
+-#define ENHANCED_ATOS_ADDR_ATTR_MASK GENMASK_ULL(9, 6)
+-
+-#define ENHANCED_ATOS_PAR 0x10
+-#define ENHANCED_ATOS_PAR_FAULT (1 << 0)
+-#define ENHANCED_ATOS_PAR_SIZE (1 << 11)
+-#define ENHANCED_ATOS_PAR_ADDR_MASK GENMASK_ULL(51, 12)
+-#define ENHANCED_ATOS_PAR_FAULTCODE GENMASK_ULL(11, 4)
+-#define ENHANCED_ATOS_PAR_REASON GENMASK_ULL(2, 1)
+-
+-#define AGENT_SMMU_POLL_US 5
+-#define AGENT_SMMU_TIMEOUT_US 250
+-#define MAX_REGISTERS 32
+-
+-static LIST_HEAD(agent_smmu_list);
+-static DEFINE_SPINLOCK(agent_smmu_lock);
+-
+-struct agent_smmu {
+- struct device *dev;
+- void __iomem *base;
+- unsigned int max_sid;
+- unsigned int max_ssid;
+- rwlock_t rw_lock;
+- DECLARE_BITMAP(regs, MAX_REGISTERS);
+-
+- struct list_head list;
+- u64 device_id; /* DIE id */
+-};
+-
+-struct agent_smmu *agent_smmu_unlocked_find(u64 device_id)
+-{
+- struct agent_smmu *temp = NULL;
+-
+- list_for_each_entry(temp, &agent_smmu_list, list) {
+- if (temp->device_id == device_id) {
+- return temp;
+- }
+- }
+- return NULL;
+-}
+-
+-static int agent_smmu_register(struct agent_smmu *agent)
+-{
+- struct device *dev = agent->dev;
+-
+- spin_lock(&agent_smmu_lock);
+- if (agent_smmu_unlocked_find(agent->device_id)) {
+- dev_err(dev, "already added for %lld.\n", agent->device_id);
+- spin_unlock(&agent_smmu_lock);
+- return -EFAULT;
+- }
+- list_add_tail(&agent->list, &agent_smmu_list);
+- spin_unlock(&agent_smmu_lock);
+-
+- return 0;
+-}
+-
+-static void agent_smmu_unregister(struct agent_smmu *agent)
+-{
+- spin_lock(&agent_smmu_lock);
+- list_del(&agent->list);
+- spin_unlock(&agent_smmu_lock);
+-}
+-
+-static int agent_smmu_platform_probe(struct platform_device *pdev)
+-{
+- struct agent_smmu *agent = NULL;
+- struct device *dev = &pdev->dev;
+- struct resource *res = NULL;
+- u32 reg = 0;
+- int ret = 0;
+- acpi_status status = AE_OK;
+-
+- agent = devm_kzalloc(dev, sizeof(*agent), GFP_KERNEL);
+- if (!agent) {
+- dev_err(dev, "failed to allocate agent smmu.\n");
+- return -ENOMEM;
+- }
+-
+- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+- if (!res || resource_size(res) + 1 < ENHANCED_ATOS_UNIT_ADDR +
+- ENHANCED_ATOS_UNIT_SIZE * MAX_REGISTERS) {
+- dev_err(dev, "MMIO region is null or too small, check it.\n");
+- ret = -EINVAL;
+- goto err_free;
+- }
+-
+- // agent smmu may probe as smmu in device, so keep using ioreamp
+- agent->base = ioremap(res->start, resource_size(res));
+- if (!agent->base) {
+- dev_err(dev, "unable to map agent smmu.\n");
+- ret = -ENOMEM;
+- goto err_free;
+- }
+-
+- /* check agent smmu is enabled */
+- reg = readl_relaxed(agent->base + AGENT_SMMU_CR0);
+- if (!(reg & CR0_SMMUEN)) {
+- dev_err(dev, "agent smmu is not enabled, check it.\n");
+- ret = -EPERM;
+- goto err_iounmap;
+- }
+-
+- status = acpi_evaluate_integer(ACPI_HANDLE(&pdev->dev), METHOD_NAME__UID,
+- NULL, &agent->device_id);
+- if (ACPI_FAILURE(status)) {
+- dev_err(dev, "Unable to get agent smmu _UID.\n");
+- ret = -ENODEV;
+- goto err_iounmap;
+- }
+-
+- if (agent_smmu_register(agent)) {
+- ret = -EINVAL;
+- goto err_iounmap;
+- }
+-
+- reg = readl_relaxed(agent->base + AGENT_SMMU_IDR1);
+- agent->max_sid = (1U << FIELD_GET(IDR1_SIDSIZE, reg)) - 1;
+- agent->max_ssid = (1U << FIELD_GET(IDR1_SSIDSIZE, reg)) - 1;
+- bitmap_zero(agent->regs, MAX_REGISTERS);
+- rwlock_init(&agent->rw_lock);
+- agent->dev = dev;
+- platform_set_drvdata(pdev, agent);
+-
+- dev_info(dev, "agent smmu 0x%llx probed successfully.\n", agent->device_id);
+- return ret;
+-err_iounmap:
+- iounmap(agent->base);
+- agent->base = NULL;
+-err_free:
+- devm_kfree(dev, agent);
+- return ret;
+-}
+-
+-static int agent_smmu_platform_remove(struct platform_device *pdev)
+-{
+- struct agent_smmu *agent = platform_get_drvdata(pdev);
+-
+- agent_smmu_unregister(agent);
+- iounmap(agent->base);
+- agent->dev = NULL;
+- agent->base = NULL;
+- dev_info(&pdev->dev, "agent smmu removed successfully.\n");
+- return 0;
+-}
+-
+-static void set_registers_unlocked(struct agent_smmu *agent, unsigned long *avl_regs,
+- unsigned long *loc_regs, int nr)
+-{
+- int idx = 0;
+-
+- while (nr > 0) {
+- idx = find_next_bit(avl_regs, MAX_REGISTERS, idx);
+- set_bit(idx, loc_regs);
+- set_bit(idx, agent->regs);
+- nr--;
+- idx++;
+- }
+-}
+-
+-/**
+- * registers_acquire - take up available registers(some reg may keep unavailable
+- * state) from agent smmu according to the number of 'need', mark them in
+- * 'loc_regs' and return the number of registers in procession
+- *
+- * @agent: agent smmu
+- * @loc_regs: bitmap recored user's available registers
+- * @need: the number of task still need to be processed
+- */
+-static int registers_acquire(struct agent_smmu *agent, unsigned long *loc_regs,
+- int need)
+-{
+- int rest = 0;
+- u32 avl_regs_state = 0;
+- DECLARE_BITMAP(avl_regs, MAX_REGISTERS);
+-
+- write_lock(&agent->rw_lock);
+- if (bitmap_full(agent->regs, MAX_REGISTERS)) {
+- rest = 0;
+- } else {
+- avl_regs_state = readl_relaxed(agent->base + AGENT_SMMU_ATOS_CTRL);
+- avl_regs_state = ~avl_regs_state;
+- bitmap_from_arr32(avl_regs, &avl_regs_state, MAX_REGISTERS);
+- bitmap_andnot(avl_regs, avl_regs, agent->regs, MAX_REGISTERS);
+- rest = bitmap_weight(avl_regs, MAX_REGISTERS);
+- }
+- set_registers_unlocked(agent, avl_regs, loc_regs, need > rest ? rest : need);
+- write_unlock(&agent->rw_lock);
+-
+- return bitmap_weight(loc_regs, MAX_REGISTERS);
+-}
+-
+-static void write_enhanced_atos(struct agent_smmu *agent, int regs_idx, u64 sid,
+- u64 addr, dma_addr_t iova)
+-{
+- void __iomem *unit_base;
+-
+- unit_base = agent->base + ENHANCED_ATOS_UNIT_ADDR +
+- ENHANCED_ATOS_UNIT_SIZE * regs_idx;
+- addr |= iova & ENHANCED_ATOS_ADDR_ADDR_MASK;
+-
+- writeq_relaxed(addr, unit_base + ENHANCED_ATOS_ADDR);
+- writeq_relaxed(sid, unit_base + ENHANCED_ATOS_SID);
+-}
+-
+-static int get_section_mask(u64 par, u64 *section_mask)
+-{
+- int i = 0;
+-
+- // using default page size 4KB according to spec
+- *section_mask = ~((1 << 12) - 1);
+-
+- // e.g. PAR[Size] is 1 && PAR[14:12] is 0 && PAR[15] is 1, then lowest
+- // bit is 15, so section size is 2^(12+3+1) = 64KB
+- if (par & ENHANCED_ATOS_PAR_SIZE) {
+- par = FIELD_GET(ENHANCED_ATOS_PAR_ADDR_MASK, par);
+- if (!par) {
+- pr_err("agent smmu: err happen in agent smmu PAR[11]\n");
+- return -EFAULT;
+- }
+-
+- par = (par ^ (par - 1)) >> 1;
+- for (i = 0; par; i++) {
+- par >>= 1;
+- }
+- *section_mask = ~((1 << (12 + i + 1)) - 1);
+- }
+- return 0;
+-}
+-
+-static int read_enhanced_atos(struct agent_smmu *agent, int regs_idx, int idx,
+- u32 state, struct agent_smmu_atos_data *data)
+-{
+- void __iomem *unit_base = NULL;
+- u64 par = 0;
+- int ret = 0;
+- u64 section_mask = 0;
+- u64 section = 0;
+- int i = 0;
+-
+- unit_base = agent->base + ENHANCED_ATOS_UNIT_ADDR +
+- ENHANCED_ATOS_UNIT_SIZE * regs_idx;
+- par = readq_relaxed(unit_base + ENHANCED_ATOS_PAR);
+-
+- if (state & (1 << regs_idx)) {
+- return -EBUSY;
+- } else if (par & ENHANCED_ATOS_PAR_FAULT) {
+- data->pa[idx] = par & ENHANCED_ATOS_PAR_FAULTCODE;
+- data->pa[idx] |= par & ENHANCED_ATOS_PAR_REASON;
+- pr_err("agent smmu: err happened, get PAR 0x%llx\n", par);
+- return -EFAULT;
+- } else {
+- ret = get_section_mask(par, §ion_mask);
+- if (ret)
+- return ret;
+- // use ENHANCED_ATOS_PAR_ADDR_MASK not section_mask
+- // since ADDR[63,52] is ATTR or IMPDEF which we don't want
+- data->pa[idx] = (par & ENHANCED_ATOS_PAR_ADDR_MASK & section_mask) |
+- (data->iova[idx] & ~section_mask);
+- section = data->iova[idx] & section_mask;
+-
+- for (i = idx + 1; i < data->nr; i++) {
+- if ((data->iova[i] & section_mask) != section)
+- break;
+- data->pa[i] = (par & ENHANCED_ATOS_PAR_ADDR_MASK & section_mask) |
+- (data->iova[i] & ~section_mask);
+- }
+- }
+- return 0;
+-}
+-
+-#define bitmap_for_each_set_bit(i, src, nbits) \
+- for ((i) = 0; ((i) = find_next_bit((src), (nbits), (i))) < (nbits); (i) += 1)
+-
+-int agent_smmu_iova_to_phys(struct agent_smmu_atos_data *data, int *succeed)
+-{
+- struct agent_smmu *agent = NULL;
+- int ret = 0;
+- int i;
+- u64 sid = 0;
+- u64 addr = 0;
+- int idx = 0;
+- u32 state = 0;
+- DECLARE_BITMAP(loc_regs, MAX_REGISTERS);
+- DECLARE_BITMAP(bitmask, MAX_REGISTERS);
+- u32 bitmask_u32;
+-
+- if (!data || !data->iova || !data->pa || data->nr <= 0 || !succeed) {
+- return -EINVAL;
+- }
+-
+- // now only HTTUI = 1 is allowed
+- if (!(data->flag & ENHANCED_ATOS_ADDR_HTTUI_MASK)) {
+- pr_err("agent smmu: check httui, make sure is valid\n");
+- return -EINVAL;
+- }
+-
+- spin_lock(&agent_smmu_lock);
+- agent = agent_smmu_unlocked_find(data->device_id);
+- if (!agent || !get_device(agent->dev)) {
+- pr_err("agent smmu: %lld has been removed or hasn't initialized.\n",
+- data->device_id);
+- spin_unlock(&agent_smmu_lock);
+- return -EINVAL;
+- }
+- spin_unlock(&agent_smmu_lock);
+-
+- if (data->sid > agent->max_sid || data->ssid > agent->max_ssid) {
+- pr_err("agent smmu: sid or ssid out of acceptable range.\n");
+- ret = -EINVAL;
+- goto put_device;
+- }
+-
+- *succeed = 0;
+- /* make sure default return is 0 because 0 make sence too */
+- for (i = 0; i < data->nr; i++) {
+- data->pa[i] = 0;
+- }
+- /* joint sid and addr first*/
+- sid = FIELD_PREP(ENHANCED_ATOS_STREAMID_MASK, data->sid);
+- sid |= FIELD_PREP(ENHANCED_ATOS_SUBSTREAMID_MASK, data->ssid);
+- sid |= FIELD_PREP(ENHANCED_ATOS_SSID_VALID_MASK, data->ssid ? 1 : 0);
+- addr |= FIELD_PREP(ENHANCED_ATOS_ADDR_TYPE_MASK, ENHANCED_ATOS_ADDR_TYPE_S1);
+- addr |= (u64) data->flag & ENHANCED_ATOS_ADDR_ATTR_MASK;
+- bitmap_zero(loc_regs, MAX_REGISTERS);
+- if (!registers_acquire(agent, loc_regs, data->nr)) {
+- pr_err("agent smmu: busy now, try again later.\n");
+- ret = -EBUSY;
+- goto put_device;
+- }
+-
+- idx = *succeed;
+- while (idx < data->nr) {
+- bitmap_zero(bitmask, MAX_REGISTERS);
+-
+- bitmap_for_each_set_bit(i, loc_regs, MAX_REGISTERS) {
+- if (idx >= data->nr)
+- break;
+- write_enhanced_atos(agent, i, sid, addr, data->iova[idx++]);
+- bitmap_set(bitmask, i, MAX_REGISTERS);
+- }
+-
+- bitmap_to_arr32(&bitmask_u32, bitmask, MAX_REGISTERS);
+- writel(bitmask_u32, agent->base + AGENT_SMMU_ATOS_CTRL);
+- readl_poll_timeout(agent->base + AGENT_SMMU_ATOS_CTRL, state,
+- !(state & bitmask_u32), AGENT_SMMU_POLL_US,
+- AGENT_SMMU_TIMEOUT_US);
+-
+- idx = *succeed;
+- bitmap_for_each_set_bit(i, bitmask, MAX_REGISTERS) {
+- if (idx >= data->nr)
+- break;
+-
+- if (data->pa[idx] != 0) {
+- idx++;
+- continue;
+- }
+- ret = read_enhanced_atos(agent, i, idx, state, data);
+- if (ret) {
+- *succeed = idx;
+- pr_err("agent smmu: translate failed, reason %d\n", ret);
+- goto free_bits;
+- }
+- idx++;
+- }
+- *succeed = idx;
+- }
+-
+-free_bits:
+- write_lock(&agent->rw_lock);
+- bitmap_andnot(agent->regs, agent->regs, loc_regs, MAX_REGISTERS);
+- write_unlock(&agent->rw_lock);
+-put_device:
+- put_device(agent->dev);
+- return ret;
+-}
+-EXPORT_SYMBOL_GPL(agent_smmu_iova_to_phys);
+-
+-static const struct acpi_device_id agent_smmu_acpi_match[] = {
+- {"SMMU0000", 0},
+- {}
+-};
+-MODULE_DEVICE_TABLE(acpi, agent_smmu_acpi_match);
+-
+-static struct platform_driver agent_smmu_driver = {
+- .driver = {
+- .name = "agent_smmu_platform",
+- .acpi_match_table = ACPI_PTR(agent_smmu_acpi_match),
+- },
+- .probe = agent_smmu_platform_probe,
+- .remove = agent_smmu_platform_remove,
+-};
+-module_platform_driver(agent_smmu_driver);
+diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.c b/drivers/iommu/arm/arm-smmu/arm-smmu.c
+index b57536b024ac..ea89d63370d8 100644
+--- a/drivers/iommu/arm/arm-smmu/arm-smmu.c
++++ b/drivers/iommu/arm/arm-smmu/arm-smmu.c
+@@ -43,9 +43,6 @@
+
+ #include "arm-smmu.h"
+
+-#ifdef CONFIG_ARCH_PHYTIUM
+-#include
+-#endif
+ /*
+ * Apparently, some Qualcomm arm64 platforms which appear to expose their SMMU
+ * global register space are still, in fact, using a hypervisor to mediate it
+@@ -57,7 +54,6 @@
+
+ #define MSI_IOVA_BASE 0x8000000
+ #define MSI_IOVA_LENGTH 0x100000
+-#define SMR_MASK_SHIFT 16
+
+ static int force_stage;
+ module_param(force_stage, int, S_IRUGO);
+@@ -1376,20 +1372,6 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev)
+ return ERR_PTR(-ENODEV);
+ }
+
+-#ifdef CONFIG_ARCH_PHYTIUM
+- /* ft2000+ */
+- if (typeof_ft2000plus()) {
+- int num = fwspec->num_ids;
+-
+- for (i = 0; i < num; i++) {
+-#define FWID_READ(id) (((u16)(id) >> 3) | (((id) >> SMR_MASK_SHIFT | 0x7000) << SMR_MASK_SHIFT))
+- u32 fwid = FWID_READ(fwspec->ids[i]);
+-
+- iommu_fwspec_add_ids(dev, &fwid, 1);
+- }
+- }
+-#endif
+-
+ ret = -EINVAL;
+ for (i = 0; i < fwspec->num_ids; i++) {
+ u16 sid = FIELD_GET(ARM_SMMU_SMR_ID, fwspec->ids[i]);
+@@ -1478,12 +1460,6 @@ static struct iommu_group *arm_smmu_device_group(struct device *dev)
+ if (group && smmu->s2crs[idx].group &&
+ group != smmu->s2crs[idx].group)
+ return ERR_PTR(-EINVAL);
+-#ifdef CONFIG_ARCH_PHYTIUM
+- if (typeof_s2500())
+- break;
+- if (typeof_ft2000plus() && !smmu->s2crs[idx].group)
+- continue;
+-#endif
+
+ group = smmu->s2crs[idx].group;
+ }
+@@ -1609,29 +1585,11 @@ static void arm_smmu_get_resv_regions(struct device *dev,
+ iommu_dma_get_resv_regions(dev, head);
+ }
+
+-#ifdef CONFIG_ARCH_PHYTIUM
+-static bool cpu_using_identity_iommu_domain(struct device *dev)
+-{
+- if (typeof_ft2000plus() || typeof_s2500())
+- return true;
+-
+- return false;
+-}
+-#else
+-static bool cpu_using_identity_iommu_domain(struct device *dev)
+-{
+- return false;
+-}
+-#endif
+-
+ static int arm_smmu_def_domain_type(struct device *dev)
+ {
+ struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev);
+ const struct arm_smmu_impl *impl = cfg->smmu->impl;
+
+- if (cpu_using_identity_iommu_domain(dev))
+- return IOMMU_DOMAIN_IDENTITY;
+-
+ if (impl && impl->def_domain_type)
+ return impl->def_domain_type(dev);
+
+@@ -2146,10 +2104,11 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
+ if (err)
+ return err;
+
+- smmu->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ ioaddr = res->start;
++ smmu->base = devm_ioremap_resource(dev, res);
+ if (IS_ERR(smmu->base))
+ return PTR_ERR(smmu->base);
+- ioaddr = res->start;
+ /*
+ * The resource size should effectively match the value of SMMU_TOP;
+ * stash that temporarily until we know PAGESIZE to validate it with.
+diff --git a/drivers/iommu/arm/arm-smmu/qcom_iommu.c b/drivers/iommu/arm/arm-smmu/qcom_iommu.c
+index 38641110be00..7f280c8d5c53 100644
+--- a/drivers/iommu/arm/arm-smmu/qcom_iommu.c
++++ b/drivers/iommu/arm/arm-smmu/qcom_iommu.c
+@@ -758,12 +758,9 @@ static bool qcom_iommu_has_secure_context(struct qcom_iommu_dev *qcom_iommu)
+ {
+ struct device_node *child;
+
+- for_each_child_of_node(qcom_iommu->dev->of_node, child) {
+- if (of_device_is_compatible(child, "qcom,msm-iommu-v1-sec")) {
+- of_node_put(child);
++ for_each_child_of_node(qcom_iommu->dev->of_node, child)
++ if (of_device_is_compatible(child, "qcom,msm-iommu-v1-sec"))
+ return true;
+- }
+- }
+
+ return false;
+ }
+diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
+index d1539b7399a9..0cbcd3fc3e7e 100644
+--- a/drivers/iommu/dma-iommu.c
++++ b/drivers/iommu/dma-iommu.c
+@@ -216,11 +216,9 @@ static int iova_reserve_pci_windows(struct pci_dev *dev,
+ lo = iova_pfn(iovad, start);
+ hi = iova_pfn(iovad, end);
+ reserve_iova(iovad, lo, hi);
+- } else if (end < start) {
++ } else {
+ /* dma_ranges list should be sorted */
+- dev_err(&dev->dev,
+- "Failed to reserve IOVA [%pa-%pa]\n",
+- &start, &end);
++ dev_err(&dev->dev, "Failed to reserve IOVA\n");
+ return -EINVAL;
+ }
+
+diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c
+index 0cdb5493a464..de324b4eedfe 100644
+--- a/drivers/iommu/exynos-iommu.c
++++ b/drivers/iommu/exynos-iommu.c
+@@ -635,7 +635,7 @@ static int exynos_sysmmu_probe(struct platform_device *pdev)
+
+ ret = iommu_device_register(&data->iommu);
+ if (ret)
+- goto err_iommu_register;
++ return ret;
+
+ platform_set_drvdata(pdev, data);
+
+@@ -662,10 +662,6 @@ static int exynos_sysmmu_probe(struct platform_device *pdev)
+ pm_runtime_enable(dev);
+
+ return 0;
+-
+-err_iommu_register:
+- iommu_device_sysfs_remove(&data->iommu);
+- return ret;
+ }
+
+ static int __maybe_unused exynos_sysmmu_suspend(struct device *dev)
+diff --git a/drivers/iommu/fsl_pamu.c b/drivers/iommu/fsl_pamu.c
+index 25689bdf812e..b9a974d97831 100644
+--- a/drivers/iommu/fsl_pamu.c
++++ b/drivers/iommu/fsl_pamu.c
+@@ -1122,7 +1122,7 @@ static int fsl_pamu_probe(struct platform_device *pdev)
+ ret = create_csd(ppaact_phys, mem_size, csd_port_id);
+ if (ret) {
+ dev_err(dev, "could not create coherence subdomain\n");
+- goto error;
++ return ret;
+ }
+ }
+
+diff --git a/drivers/iommu/intel/Kconfig b/drivers/iommu/intel/Kconfig
+index cecdad7f2aba..5337ee1584b0 100644
+--- a/drivers/iommu/intel/Kconfig
++++ b/drivers/iommu/intel/Kconfig
+@@ -40,7 +40,6 @@ config INTEL_IOMMU_SVM
+ select PCI_PRI
+ select MMU_NOTIFIER
+ select IOASID
+- select IOMMU_SVA
+ help
+ Shared Virtual Memory (SVM) provides a facility for devices
+ to access DMA resources through process address space by
+diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
+index 9e591594183e..02e7c10a4224 100644
+--- a/drivers/iommu/intel/dmar.c
++++ b/drivers/iommu/intel/dmar.c
+@@ -215,7 +215,7 @@ static bool dmar_match_pci_path(struct dmar_pci_notify_info *info, int bus,
+ }
+
+ /* Return: > 0 if match found, 0 if no match found, < 0 if error happens */
+-int dmar_pci_insert_dev_scope(struct dmar_pci_notify_info *info,
++int dmar_insert_dev_scope(struct dmar_pci_notify_info *info,
+ void *start, void*end, u16 segment,
+ struct dmar_dev_scope *devices,
+ int devices_cnt)
+@@ -304,7 +304,7 @@ static int dmar_pci_bus_add_dev(struct dmar_pci_notify_info *info)
+
+ drhd = container_of(dmaru->hdr,
+ struct acpi_dmar_hardware_unit, header);
+- ret = dmar_pci_insert_dev_scope(info, (void *)(drhd + 1),
++ ret = dmar_insert_dev_scope(info, (void *)(drhd + 1),
+ ((void *)drhd) + drhd->header.length,
+ dmaru->segment,
+ dmaru->devices, dmaru->devices_cnt);
+@@ -385,7 +385,7 @@ static int dmar_pci_bus_notifier(struct notifier_block *nb,
+
+ static struct notifier_block dmar_pci_bus_nb = {
+ .notifier_call = dmar_pci_bus_notifier,
+- .priority = 1,
++ .priority = INT_MIN,
+ };
+
+ static struct dmar_drhd_unit *
+@@ -497,7 +497,7 @@ static int dmar_parse_one_rhsa(struct acpi_dmar_header *header, void *arg)
+ if (drhd->reg_base_addr == rhsa->base_address) {
+ int node = pxm_to_node(rhsa->proximity_domain);
+
+- if (node != NUMA_NO_NODE && !node_online(node))
++ if (!node_online(node))
+ node = NUMA_NO_NODE;
+ drhd->iommu->node = node;
+ return 0;
+@@ -719,58 +719,47 @@ dmar_find_matched_drhd_unit(struct pci_dev *dev)
+ return dmaru;
+ }
+
+-/* Return: > 0 if match found, 0 if no match found */
+-bool dmar_acpi_insert_dev_scope(u8 device_number,
+- struct acpi_device *adev,
+- void *start, void *end,
+- struct dmar_dev_scope *devices,
+- int devices_cnt)
++static void __init dmar_acpi_insert_dev_scope(u8 device_number,
++ struct acpi_device *adev)
+ {
++ struct dmar_drhd_unit *dmaru;
++ struct acpi_dmar_hardware_unit *drhd;
+ struct acpi_dmar_device_scope *scope;
+ struct device *tmp;
+ int i;
+ struct acpi_dmar_pci_path *path;
+
+- for (; start < end; start += scope->length) {
+- scope = start;
+- if (scope->entry_type != ACPI_DMAR_SCOPE_TYPE_NAMESPACE)
+- continue;
+- if (scope->enumeration_id != device_number)
+- continue;
+- path = (void *)(scope + 1);
+- for_each_dev_scope(devices, devices_cnt, i, tmp)
+- if (tmp == NULL) {
+- devices[i].bus = scope->bus;
+- devices[i].devfn = PCI_DEVFN(path->device, path->function);
+- rcu_assign_pointer(devices[i].dev,
+- get_device(&adev->dev));
+- return true;
+- }
+- WARN_ON(i >= devices_cnt);
+- }
+- return false;
+-}
+-
+-static int dmar_acpi_bus_add_dev(u8 device_number, struct acpi_device *adev)
+-{
+- struct dmar_drhd_unit *dmaru;
+- struct acpi_dmar_hardware_unit *drhd;
+- int ret;
+-
+ for_each_drhd_unit(dmaru) {
+ drhd = container_of(dmaru->hdr,
+ struct acpi_dmar_hardware_unit,
+ header);
+- ret = dmar_acpi_insert_dev_scope(device_number, adev, (void *)(drhd+1),
+- ((void *)drhd)+drhd->header.length,
+- dmaru->devices, dmaru->devices_cnt);
+- if (ret)
+- break;
+- }
+- if (ret > 0)
+- ret = dmar_rmrr_add_acpi_dev(device_number, adev);
+
+- return ret;
++ for (scope = (void *)(drhd + 1);
++ (unsigned long)scope < ((unsigned long)drhd) + drhd->header.length;
++ scope = ((void *)scope) + scope->length) {
++ if (scope->entry_type != ACPI_DMAR_SCOPE_TYPE_NAMESPACE)
++ continue;
++ if (scope->enumeration_id != device_number)
++ continue;
++
++ path = (void *)(scope + 1);
++ pr_info("ACPI device \"%s\" under DMAR at %llx as %02x:%02x.%d\n",
++ dev_name(&adev->dev), dmaru->reg_base_addr,
++ scope->bus, path->device, path->function);
++ for_each_dev_scope(dmaru->devices, dmaru->devices_cnt, i, tmp)
++ if (tmp == NULL) {
++ dmaru->devices[i].bus = scope->bus;
++ dmaru->devices[i].devfn = PCI_DEVFN(path->device,
++ path->function);
++ rcu_assign_pointer(dmaru->devices[i].dev,
++ get_device(&adev->dev));
++ return;
++ }
++ BUG_ON(i >= dmaru->devices_cnt);
++ }
++ }
++ pr_warn("No IOMMU scope found for ANDD enumeration ID %d (%s)\n",
++ device_number, dev_name(&adev->dev));
+ }
+
+ static int __init dmar_acpi_dev_scope_init(void)
+@@ -799,7 +788,7 @@ static int __init dmar_acpi_dev_scope_init(void)
+ andd->device_name);
+ continue;
+ }
+- dmar_acpi_bus_add_dev(andd->device_number, adev);
++ dmar_acpi_insert_dev_scope(andd->device_number, adev);
+ }
+ }
+ return 0;
+@@ -827,7 +816,6 @@ int __init dmar_dev_scope_init(void)
+ info = dmar_alloc_pci_notify_info(dev,
+ BUS_NOTIFY_ADD_DEVICE);
+ if (!info) {
+- pci_dev_put(dev);
+ return dmar_dev_scope_status;
+ } else {
+ dmar_pci_bus_add_dev(info);
+@@ -1149,7 +1137,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
+
+ err = iommu_device_register(&iommu->iommu);
+ if (err)
+- goto err_sysfs;
++ goto err_unmap;
+ }
+
+ drhd->iommu = iommu;
+@@ -1157,8 +1145,6 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
+
+ return 0;
+
+-err_sysfs:
+- iommu_device_sysfs_remove(&iommu->iommu);
+ err_unmap:
+ unmap_iommu(iommu);
+ error_free_seq_id:
+diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
+index a19dbb9483eb..e3a7e3f546a0 100644
+--- a/drivers/iommu/intel/iommu.c
++++ b/drivers/iommu/intel/iommu.c
+@@ -560,36 +560,14 @@ static inline int domain_pfn_supported(struct dmar_domain *domain,
+ return !(addr_width < BITS_PER_LONG && pfn >> addr_width);
+ }
+
+-/*
+- * Calculate the Supported Adjusted Guest Address Widths of an IOMMU.
+- * Refer to 11.4.2 of the VT-d spec for the encoding of each bit of
+- * the returned SAGAW.
+- */
+-static unsigned long __iommu_calculate_sagaw(struct intel_iommu *iommu)
+-{
+- unsigned long fl_sagaw, sl_sagaw;
+-
+- fl_sagaw = BIT(2) | (cap_5lp_support(iommu->cap) ? BIT(3) : 0);
+- sl_sagaw = cap_sagaw(iommu->cap);
+-
+- /* Second level only. */
+- if (!sm_supported(iommu) || !ecap_flts(iommu->ecap))
+- return sl_sagaw;
+-
+- /* First level only. */
+- if (!ecap_slts(iommu->ecap))
+- return fl_sagaw;
+-
+- return fl_sagaw & sl_sagaw;
+-}
+-
+ static int __iommu_calculate_agaw(struct intel_iommu *iommu, int max_gaw)
+ {
+ unsigned long sagaw;
+ int agaw = -1;
+
+- sagaw = __iommu_calculate_sagaw(iommu);
+- for (agaw = width_to_agaw(max_gaw); agaw >= 0; agaw--) {
++ sagaw = cap_sagaw(iommu->cap);
++ for (agaw = width_to_agaw(max_gaw);
++ agaw >= 0; agaw--) {
+ if (test_bit(agaw, &sagaw))
+ break;
+ }
+@@ -755,8 +733,6 @@ static int domain_update_device_node(struct dmar_domain *domain)
+ return nid;
+ }
+
+-static void domain_update_iotlb(struct dmar_domain *domain);
+-
+ /* Some capabilities may be different across iommus */
+ static void domain_update_iommu_cap(struct dmar_domain *domain)
+ {
+@@ -782,8 +758,6 @@ static void domain_update_iommu_cap(struct dmar_domain *domain)
+ domain->domain.geometry.aperture_end = __DOMAIN_MAX_ADDR(domain->gaw - 1);
+ else
+ domain->domain.geometry.aperture_end = __DOMAIN_MAX_ADDR(domain->gaw);
+-
+- domain_update_iotlb(domain);
+ }
+
+ struct context_entry *iommu_context_addr(struct intel_iommu *iommu, u8 bus,
+@@ -1519,21 +1493,16 @@ static void domain_update_iotlb(struct dmar_domain *domain)
+
+ assert_spin_locked(&device_domain_lock);
+
+- list_for_each_entry(info, &domain->devices, link)
+- if (info->ats_enabled) {
+- has_iotlb_device = true;
+- break;
+- }
++ list_for_each_entry(info, &domain->devices, link) {
++ struct pci_dev *pdev;
+
+- if (!has_iotlb_device) {
+- struct subdev_domain_info *sinfo;
++ if (!info->dev || !dev_is_pci(info->dev))
++ continue;
+
+- list_for_each_entry(sinfo, &domain->subdevices, link_domain) {
+- info = get_domain_info(sinfo->pdev);
+- if (info && info->ats_enabled) {
+- has_iotlb_device = true;
+- break;
+- }
++ pdev = to_pci_dev(info->dev);
++ if (pdev->ats_enabled) {
++ has_iotlb_device = true;
++ break;
+ }
+ }
+
+@@ -1615,37 +1584,25 @@ static void iommu_disable_dev_iotlb(struct device_domain_info *info)
+ #endif
+ }
+
+-static void __iommu_flush_dev_iotlb(struct device_domain_info *info,
+- u64 addr, unsigned int mask)
+-{
+- u16 sid, qdep;
+-
+- if (!info || !info->ats_enabled)
+- return;
+-
+- sid = info->bus << 8 | info->devfn;
+- qdep = info->ats_qdep;
+- qi_flush_dev_iotlb(info->iommu, sid, info->pfsid,
+- qdep, addr, mask);
+-}
+-
+ static void iommu_flush_dev_iotlb(struct dmar_domain *domain,
+ u64 addr, unsigned mask)
+ {
++ u16 sid, qdep;
+ unsigned long flags;
+ struct device_domain_info *info;
+- struct subdev_domain_info *sinfo;
+
+ if (!domain->has_iotlb_device)
+ return;
+
+ spin_lock_irqsave(&device_domain_lock, flags);
+- list_for_each_entry(info, &domain->devices, link)
+- __iommu_flush_dev_iotlb(info, addr, mask);
++ list_for_each_entry(info, &domain->devices, link) {
++ if (!info->ats_enabled)
++ continue;
+
+- list_for_each_entry(sinfo, &domain->subdevices, link_domain) {
+- info = get_domain_info(sinfo->pdev);
+- __iommu_flush_dev_iotlb(info, addr, mask);
++ sid = info->bus << 8 | info->devfn;
++ qdep = info->ats_qdep;
++ qi_flush_dev_iotlb(info->iommu, sid, info->pfsid,
++ qdep, addr, mask);
+ }
+ spin_unlock_irqrestore(&device_domain_lock, flags);
+ }
+@@ -1669,8 +1626,7 @@ static void iommu_flush_iotlb_psi(struct intel_iommu *iommu,
+ unsigned long pfn, unsigned int pages,
+ int ih, int map)
+ {
+- unsigned int aligned_pages = __roundup_pow_of_two(pages);
+- unsigned int mask = ilog2(aligned_pages);
++ unsigned int mask = ilog2(__roundup_pow_of_two(pages));
+ uint64_t addr = (uint64_t)pfn << VTD_PAGE_SHIFT;
+ u16 did = domain->iommu_did[iommu->seq_id];
+
+@@ -1682,30 +1638,10 @@ static void iommu_flush_iotlb_psi(struct intel_iommu *iommu,
+ if (domain_use_first_level(domain)) {
+ domain_flush_piotlb(iommu, domain, addr, pages, ih);
+ } else {
+- unsigned long bitmask = aligned_pages - 1;
+-
+- /*
+- * PSI masks the low order bits of the base address. If the
+- * address isn't aligned to the mask, then compute a mask value
+- * needed to ensure the target range is flushed.
+- */
+- if (unlikely(bitmask & pfn)) {
+- unsigned long end_pfn = pfn + pages - 1, shared_bits;
+-
+- /*
+- * Since end_pfn <= pfn + bitmask, the only way bits
+- * higher than bitmask can differ in pfn and end_pfn is
+- * by carrying. This means after masking out bitmask,
+- * high bits starting with the first set bit in
+- * shared_bits are all equal in both pfn and end_pfn.
+- */
+- shared_bits = ~(pfn ^ end_pfn) & ~bitmask;
+- mask = shared_bits ? __ffs(shared_bits) : BITS_PER_LONG;
+- }
+-
+ /*
+ * Fallback to domain selective flush if no PSI support or
+- * the size is too big.
++ * the size is too big. PSI requires page size to be 2 ^ x,
++ * and the base address is naturally aligned to the size.
+ */
+ if (!cap_pgsel_inv(iommu->cap) ||
+ mask > cap_max_amask_val(iommu->cap))
+@@ -1972,7 +1908,6 @@ static struct dmar_domain *alloc_domain(int flags)
+ domain->flags |= DOMAIN_FLAG_USE_FIRST_LEVEL;
+ domain->has_iotlb_device = false;
+ INIT_LIST_HEAD(&domain->devices);
+- INIT_LIST_HEAD(&domain->subdevices);
+
+ return domain;
+ }
+@@ -2570,11 +2505,10 @@ static inline int domain_pfn_mapping(struct dmar_domain *domain, unsigned long i
+ return domain_mapping(domain, iov_pfn, NULL, phys_pfn, nr_pages, prot);
+ }
+
+-static void domain_context_clear_one(struct device_domain_info *info, u8 bus, u8 devfn)
++static void domain_context_clear_one(struct intel_iommu *iommu, u8 bus, u8 devfn)
+ {
+- struct intel_iommu *iommu = info->iommu;
+- struct context_entry *context;
+ unsigned long flags;
++ struct context_entry *context;
+ u16 did_old;
+
+ if (!iommu)
+@@ -2586,16 +2520,7 @@ static void domain_context_clear_one(struct device_domain_info *info, u8 bus, u8
+ spin_unlock_irqrestore(&iommu->lock, flags);
+ return;
+ }
+-
+- if (sm_supported(iommu)) {
+- if (hw_pass_through && domain_type_is_si(info->domain))
+- did_old = FLPT_DEFAULT_DID;
+- else
+- did_old = info->domain->iommu_did[iommu->seq_id];
+- } else {
+- did_old = context_domain_id(context);
+- }
+-
++ did_old = context_domain_id(context);
+ context_clear_entry(context);
+ __iommu_flush_cache(iommu, context, sizeof(*context));
+ spin_unlock_irqrestore(&iommu->lock, flags);
+@@ -2613,8 +2538,6 @@ static void domain_context_clear_one(struct device_domain_info *info, u8 bus, u8
+ 0,
+ 0,
+ DMA_TLB_DSI_FLUSH);
+-
+- __iommu_flush_dev_iotlb(info, 0, MAX_AGAW_PFN_WIDTH);
+ }
+
+ static inline void unlink_domain_info(struct device_domain_info *info)
+@@ -2683,9 +2606,9 @@ static int domain_setup_first_level(struct intel_iommu *iommu,
+ struct device *dev,
+ u32 pasid)
+ {
++ int flags = PASID_FLAG_SUPERVISOR_MODE;
+ struct dma_pte *pgd = domain->pgd;
+ int agaw, level;
+- int flags = 0;
+
+ /*
+ * Skip top levels of page tables for iommu which has
+@@ -2701,10 +2624,7 @@ static int domain_setup_first_level(struct intel_iommu *iommu,
+ if (level != 4 && level != 5)
+ return -EINVAL;
+
+- if (pasid != PASID_RID2PASID)
+- flags |= PASID_FLAG_SUPERVISOR_MODE;
+- if (level == 5)
+- flags |= PASID_FLAG_FL5LP;
++ flags |= (level == 5) ? PASID_FLAG_FL5LP : 0;
+
+ if (domain->domain.type == IOMMU_DOMAIN_UNMANAGED)
+ flags |= PASID_FLAG_PAGE_SNOOP;
+@@ -2754,7 +2674,7 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu,
+ info->iommu = iommu;
+ info->pasid_table = NULL;
+ info->auxd_enabled = 0;
+- INIT_LIST_HEAD(&info->subdevices);
++ INIT_LIST_HEAD(&info->auxiliary_domains);
+
+ if (dev && dev_is_pci(dev)) {
+ struct pci_dev *pdev = to_pci_dev(info->dev);
+@@ -2880,7 +2800,6 @@ static int __init si_domain_init(int hw)
+
+ if (md_domain_init(si_domain, DEFAULT_DOMAIN_ADDRESS_WIDTH)) {
+ domain_exit(si_domain);
+- si_domain = NULL;
+ return -EFAULT;
+ }
+
+@@ -3540,10 +3459,6 @@ static int __init init_dmars(void)
+ disable_dmar_iommu(iommu);
+ free_dmar_iommu(iommu);
+ }
+- if (si_domain) {
+- domain_exit(si_domain);
+- si_domain = NULL;
+- }
+
+ kfree(g_iommus);
+
+@@ -4682,25 +4597,6 @@ int dmar_find_matched_atsr_unit(struct pci_dev *dev)
+ return ret;
+ }
+
+-int dmar_rmrr_add_acpi_dev(u8 device_number, struct acpi_device *adev)
+-{
+- int ret;
+- struct dmar_rmrr_unit *rmrru;
+- struct acpi_dmar_reserved_memory *rmrr;
+-
+- list_for_each_entry(rmrru, &dmar_rmrr_units, list) {
+- rmrr = container_of(rmrru->hdr,
+- struct acpi_dmar_reserved_memory,
+- header);
+- ret = dmar_acpi_insert_dev_scope(device_number, adev, (void *)(rmrr + 1),
+- ((void *)rmrr) + rmrr->header.length,
+- rmrru->devices, rmrru->devices_cnt);
+- if (ret)
+- break;
+- }
+- return 0;
+-}
+-
+ int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info)
+ {
+ int ret;
+@@ -4716,7 +4612,7 @@ int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info)
+ rmrr = container_of(rmrru->hdr,
+ struct acpi_dmar_reserved_memory, header);
+ if (info->event == BUS_NOTIFY_ADD_DEVICE) {
+- ret = dmar_pci_insert_dev_scope(info, (void *)(rmrr + 1),
++ ret = dmar_insert_dev_scope(info, (void *)(rmrr + 1),
+ ((void *)rmrr) + rmrr->header.length,
+ rmrr->segment, rmrru->devices,
+ rmrru->devices_cnt);
+@@ -4734,7 +4630,7 @@ int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info)
+
+ atsr = container_of(atsru->hdr, struct acpi_dmar_atsr, header);
+ if (info->event == BUS_NOTIFY_ADD_DEVICE) {
+- ret = dmar_pci_insert_dev_scope(info, (void *)(atsr + 1),
++ ret = dmar_insert_dev_scope(info, (void *)(atsr + 1),
+ (void *)atsr + atsr->header.length,
+ atsr->segment, atsru->devices,
+ atsru->devices_cnt);
+@@ -4946,10 +4842,8 @@ static inline bool has_external_pci(void)
+ struct pci_dev *pdev = NULL;
+
+ for_each_pci_dev(pdev)
+- if (pdev->external_facing) {
+- pci_dev_put(pdev);
++ if (pdev->external_facing)
+ return true;
+- }
+
+ return false;
+ }
+@@ -4975,22 +4869,6 @@ static int __init platform_optin_force_iommu(void)
+ return 1;
+ }
+
+-static int acpi_device_create_direct_mappings(struct device *pn_dev, struct device *acpi_device)
+-{
+- struct iommu_group *group;
+-
+- acpi_device->bus->iommu_ops = &intel_iommu_ops;
+- group = iommu_group_get(pn_dev);
+- if (!group) {
+- pr_warn("ACPI name space devices create direct mappings wrong!\n");
+- return -EINVAL;
+- }
+- printk(KERN_INFO "pn_dev:%s enter to %s\n", dev_name(pn_dev), __func__);
+- __acpi_device_create_direct_mappings(group, acpi_device);
+-
+- return 0;
+-}
+-
+ static int __init probe_acpi_namespace_devices(void)
+ {
+ struct dmar_drhd_unit *drhd;
+@@ -4998,7 +4876,6 @@ static int __init probe_acpi_namespace_devices(void)
+ struct intel_iommu *iommu __maybe_unused;
+ struct device *dev;
+ int i, ret = 0;
+- u8 bus, devfn;
+
+ for_each_active_iommu(iommu, drhd) {
+ for_each_active_dev_scope(drhd->devices,
+@@ -5007,8 +4884,6 @@ static int __init probe_acpi_namespace_devices(void)
+ struct iommu_group *group;
+ struct acpi_device *adev;
+
+- struct device *pn_dev = NULL;
+- struct device_domain_info *info = NULL;
+ if (dev->bus != &acpi_bus_type)
+ continue;
+
+@@ -5018,57 +4893,19 @@ static int __init probe_acpi_namespace_devices(void)
+ &adev->physical_node_list, node) {
+ group = iommu_group_get(pn->dev);
+ if (group) {
+- pn_dev = pn->dev;
+ iommu_group_put(group);
+ continue;
+ }
+
+- iommu = device_to_iommu(dev, &bus, &devfn);
+- if (!iommu) {
+- ret = -ENODEV;
+- goto unlock;
+- }
+- info = dmar_search_domain_by_dev_info(iommu->segment, bus, devfn);
+- if (!info) {
+- pn->dev->bus->iommu_ops = &intel_iommu_ops;
+- ret = iommu_probe_device(pn->dev);
+- if (ret) {
+- pr_err("pn->dev:%s probe fail! ret:%d\n",
+- dev_name(pn->dev), ret);
+- goto unlock;
+- }
+- }
+- pn_dev = pn->dev;
+- }
+- if (!pn_dev) {
+- iommu = device_to_iommu(dev, &bus, &devfn);
+- if (!iommu) {
+- ret = -ENODEV;
+- goto unlock;
+- }
+- info = dmar_search_domain_by_dev_info(iommu->segment, bus, devfn);
+- if (!info) {
+- dev->bus->iommu_ops = &intel_iommu_ops;
+- ret = iommu_probe_device(dev);
+- if (ret) {
+- pr_err("dev:%s probe fail! ret:%d\n",
+- dev_name(dev), ret);
+- goto unlock;
+- }
+- goto unlock;
+- }
++ pn->dev->bus->iommu_ops = &intel_iommu_ops;
++ ret = iommu_probe_device(pn->dev);
++ if (ret)
++ break;
+ }
+- if (!info)
+- ret = acpi_device_create_direct_mappings(pn_dev, dev);
+- else
+- ret = acpi_device_create_direct_mappings(info->dev, dev);
+-unlock:
+ mutex_unlock(&adev->physical_node_lock);
+
+- if (ret) {
+- pr_err("%s fail! ret:%d\n", __func__, ret);
++ if (ret)
+ return ret;
+- }
+ }
+ }
+
+@@ -5217,9 +5054,9 @@ int __init intel_iommu_init(void)
+
+ static int domain_context_clear_one_cb(struct pci_dev *pdev, u16 alias, void *opaque)
+ {
+- struct device_domain_info *info = opaque;
++ struct intel_iommu *iommu = opaque;
+
+- domain_context_clear_one(info, PCI_BUS_NUM(alias), alias & 0xff);
++ domain_context_clear_one(iommu, PCI_BUS_NUM(alias), alias & 0xff);
+ return 0;
+ }
+
+@@ -5229,13 +5066,12 @@ static int domain_context_clear_one_cb(struct pci_dev *pdev, u16 alias, void *op
+ * devices, unbinding the driver from any one of them will possibly leave
+ * the others unable to operate.
+ */
+-static void domain_context_clear(struct device_domain_info *info)
++static void domain_context_clear(struct intel_iommu *iommu, struct device *dev)
+ {
+- if (!info->iommu || !info->dev || !dev_is_pci(info->dev))
++ if (!iommu || !dev || !dev_is_pci(dev))
+ return;
+
+- pci_for_each_dma_alias(to_pci_dev(info->dev),
+- &domain_context_clear_one_cb, info);
++ pci_for_each_dma_alias(to_pci_dev(dev), &domain_context_clear_one_cb, iommu);
+ }
+
+ static void __dmar_remove_one_dev_info(struct device_domain_info *info)
+@@ -5252,13 +5088,14 @@ static void __dmar_remove_one_dev_info(struct device_domain_info *info)
+ iommu = info->iommu;
+ domain = info->domain;
+
+- if (info->dev && !dev_is_real_dma_subdevice(info->dev)) {
++ if (info->dev) {
+ if (dev_is_pci(info->dev) && sm_supported(iommu))
+ intel_pasid_tear_down_entry(iommu, info->dev,
+ PASID_RID2PASID, false);
+
+ iommu_disable_dev_iotlb(info);
+- domain_context_clear(info);
++ if (!dev_is_real_dma_subdevice(info->dev))
++ domain_context_clear(iommu, info->dev);
+ intel_pasid_free_table(info->dev);
+ }
+
+@@ -5373,63 +5210,33 @@ is_aux_domain(struct device *dev, struct iommu_domain *domain)
+ domain->type == IOMMU_DOMAIN_UNMANAGED;
+ }
+
+-static inline struct subdev_domain_info *
+-lookup_subdev_info(struct dmar_domain *domain, struct device *dev)
+-{
+- struct subdev_domain_info *sinfo;
+-
+- if (!list_empty(&domain->subdevices)) {
+- list_for_each_entry(sinfo, &domain->subdevices, link_domain) {
+- if (sinfo->pdev == dev)
+- return sinfo;
+- }
+- }
+-
+- return NULL;
+-}
+-
+-static int auxiliary_link_device(struct dmar_domain *domain,
+- struct device *dev)
++static void auxiliary_link_device(struct dmar_domain *domain,
++ struct device *dev)
+ {
+ struct device_domain_info *info = get_domain_info(dev);
+- struct subdev_domain_info *sinfo = lookup_subdev_info(domain, dev);
+
+ assert_spin_locked(&device_domain_lock);
+ if (WARN_ON(!info))
+- return -EINVAL;
+-
+- if (!sinfo) {
+- sinfo = kzalloc(sizeof(*sinfo), GFP_ATOMIC);
+- if (!sinfo)
+- return -ENOMEM;
+- sinfo->domain = domain;
+- sinfo->pdev = dev;
+- list_add(&sinfo->link_phys, &info->subdevices);
+- list_add(&sinfo->link_domain, &domain->subdevices);
+- }
++ return;
+
+- return ++sinfo->users;
++ domain->auxd_refcnt++;
++ list_add(&domain->auxd, &info->auxiliary_domains);
+ }
+
+-static int auxiliary_unlink_device(struct dmar_domain *domain,
+- struct device *dev)
++static void auxiliary_unlink_device(struct dmar_domain *domain,
++ struct device *dev)
+ {
+ struct device_domain_info *info = get_domain_info(dev);
+- struct subdev_domain_info *sinfo = lookup_subdev_info(domain, dev);
+- int ret;
+
+ assert_spin_locked(&device_domain_lock);
+- if (WARN_ON(!info || !sinfo || sinfo->users <= 0))
+- return -EINVAL;
++ if (WARN_ON(!info))
++ return;
+
+- ret = --sinfo->users;
+- if (!ret) {
+- list_del(&sinfo->link_phys);
+- list_del(&sinfo->link_domain);
+- kfree(sinfo);
+- }
++ list_del(&domain->auxd);
++ domain->auxd_refcnt--;
+
+- return ret;
++ if (!domain->auxd_refcnt && domain->default_pasid > 0)
++ ioasid_put(domain->default_pasid);
+ }
+
+ static int aux_domain_add_dev(struct dmar_domain *domain,
+@@ -5458,19 +5265,6 @@ static int aux_domain_add_dev(struct dmar_domain *domain,
+ }
+
+ spin_lock_irqsave(&device_domain_lock, flags);
+- ret = auxiliary_link_device(domain, dev);
+- if (ret <= 0)
+- goto link_failed;
+-
+- /*
+- * Subdevices from the same physical device can be attached to the
+- * same domain. For such cases, only the first subdevice attachment
+- * needs to go through the full steps in this function. So if ret >
+- * 1, just goto out.
+- */
+- if (ret > 1)
+- goto out;
+-
+ /*
+ * iommu->lock must be held to attach domain to iommu and setup the
+ * pasid entry for second level translation.
+@@ -5489,9 +5283,10 @@ static int aux_domain_add_dev(struct dmar_domain *domain,
+ domain->default_pasid);
+ if (ret)
+ goto table_failed;
+-
+ spin_unlock(&iommu->lock);
+-out:
++
++ auxiliary_link_device(domain, dev);
++
+ spin_unlock_irqrestore(&device_domain_lock, flags);
+
+ return 0;
+@@ -5500,11 +5295,9 @@ static int aux_domain_add_dev(struct dmar_domain *domain,
+ domain_detach_iommu(domain, iommu);
+ attach_failed:
+ spin_unlock(&iommu->lock);
+- auxiliary_unlink_device(domain, dev);
+-link_failed:
+ spin_unlock_irqrestore(&device_domain_lock, flags);
+- if (list_empty(&domain->subdevices) && domain->default_pasid > 0)
+- ioasid_free(domain->default_pasid);
++ if (!domain->auxd_refcnt && domain->default_pasid > 0)
++ ioasid_put(domain->default_pasid);
+
+ return ret;
+ }
+@@ -5523,18 +5316,14 @@ static void aux_domain_remove_dev(struct dmar_domain *domain,
+ info = get_domain_info(dev);
+ iommu = info->iommu;
+
+- if (!auxiliary_unlink_device(domain, dev)) {
+- spin_lock(&iommu->lock);
+- intel_pasid_tear_down_entry(iommu, dev,
+- domain->default_pasid, false);
+- domain_detach_iommu(domain, iommu);
+- spin_unlock(&iommu->lock);
+- }
++ auxiliary_unlink_device(domain, dev);
+
+- spin_unlock_irqrestore(&device_domain_lock, flags);
++ spin_lock(&iommu->lock);
++ intel_pasid_tear_down_entry(iommu, dev, domain->default_pasid, false);
++ domain_detach_iommu(domain, iommu);
++ spin_unlock(&iommu->lock);
+
+- if (list_empty(&domain->subdevices) && domain->default_pasid > 0)
+- ioasid_free(domain->default_pasid);
++ spin_unlock_irqrestore(&device_domain_lock, flags);
+ }
+
+ static int prepare_domain_attach_device(struct iommu_domain *domain,
+@@ -6251,12 +6040,6 @@ intel_iommu_dev_enable_feat(struct device *dev, enum iommu_dev_features feat)
+ if (!info)
+ return -EINVAL;
+
+- if (intel_iommu_enable_pasid(info->iommu, dev))
+- return -ENODEV;
+-
+- if (!info->pasid_enabled || !info->pri_enabled || !info->ats_enabled)
+- return -EINVAL;
+-
+ if (info->iommu->flags & VTD_FLAG_SVM_CAPABLE)
+ return 0;
+ }
+@@ -6494,7 +6277,7 @@ static void quirk_igfx_skip_te_disable(struct pci_dev *dev)
+ ver = (dev->device >> 8) & 0xff;
+ if (ver != 0x45 && ver != 0x46 && ver != 0x4c &&
+ ver != 0x4e && ver != 0x8a && ver != 0x98 &&
+- ver != 0x9a && ver != 0xa7)
++ ver != 0x9a)
+ return;
+
+ if (risky_device(dev))
+diff --git a/drivers/iommu/intel/irq_remapping.c b/drivers/iommu/intel/irq_remapping.c
+index b853888774e6..aedaae4630bc 100644
+--- a/drivers/iommu/intel/irq_remapping.c
++++ b/drivers/iommu/intel/irq_remapping.c
+@@ -576,8 +576,9 @@ static int intel_setup_irq_remapping(struct intel_iommu *iommu)
+ fn, &intel_ir_domain_ops,
+ iommu);
+ if (!iommu->ir_domain) {
++ irq_domain_free_fwnode(fn);
+ pr_err("IR%d: failed to allocate irqdomain\n", iommu->seq_id);
+- goto out_free_fwnode;
++ goto out_free_bitmap;
+ }
+ iommu->ir_msi_domain =
+ arch_create_remap_msi_irq_domain(iommu->ir_domain,
+@@ -601,7 +602,7 @@ static int intel_setup_irq_remapping(struct intel_iommu *iommu)
+
+ if (dmar_enable_qi(iommu)) {
+ pr_err("Failed to enable queued invalidation\n");
+- goto out_free_ir_domain;
++ goto out_free_bitmap;
+ }
+ }
+
+@@ -625,14 +626,6 @@ static int intel_setup_irq_remapping(struct intel_iommu *iommu)
+
+ return 0;
+
+-out_free_ir_domain:
+- if (iommu->ir_msi_domain)
+- irq_domain_remove(iommu->ir_msi_domain);
+- iommu->ir_msi_domain = NULL;
+- irq_domain_remove(iommu->ir_domain);
+- iommu->ir_domain = NULL;
+-out_free_fwnode:
+- irq_domain_free_fwnode(fn);
+ out_free_bitmap:
+ bitmap_free(bitmap);
+ out_free_pages:
+diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c
+index 86fd49ae7f61..ce4ef2d245e3 100644
+--- a/drivers/iommu/intel/pasid.c
++++ b/drivers/iommu/intel/pasid.c
+@@ -466,6 +466,20 @@ pasid_cache_invalidation_with_pasid(struct intel_iommu *iommu,
+ qi_submit_sync(iommu, &desc, 1, 0);
+ }
+
++static void
++iotlb_invalidation_with_pasid(struct intel_iommu *iommu, u16 did, u32 pasid)
++{
++ struct qi_desc desc;
++
++ desc.qw0 = QI_EIOTLB_PASID(pasid) | QI_EIOTLB_DID(did) |
++ QI_EIOTLB_GRAN(QI_GRAN_NONG_PASID) | QI_EIOTLB_TYPE;
++ desc.qw1 = 0;
++ desc.qw2 = 0;
++ desc.qw3 = 0;
++
++ qi_submit_sync(iommu, &desc, 1, 0);
++}
++
+ static void
+ devtlb_invalidation_with_pasid(struct intel_iommu *iommu,
+ struct device *dev, u32 pasid)
+@@ -497,26 +511,20 @@ void intel_pasid_tear_down_entry(struct intel_iommu *iommu, struct device *dev,
+ u32 pasid, bool fault_ignore)
+ {
+ struct pasid_entry *pte;
+- u16 did, pgtt;
++ u16 did;
+
+ pte = intel_pasid_get_entry(dev, pasid);
+ if (WARN_ON(!pte))
+ return;
+
+ did = pasid_get_domain_id(pte);
+- pgtt = pasid_pte_get_pgtt(pte);
+-
+ intel_pasid_clear_entry(dev, pasid, fault_ignore);
+
+ if (!ecap_coherent(iommu->ecap))
+ clflush_cache_range(pte, sizeof(*pte));
+
+ pasid_cache_invalidation_with_pasid(iommu, did, pasid);
+-
+- if (pgtt == PASID_ENTRY_PGTT_PT || pgtt == PASID_ENTRY_PGTT_FL_ONLY)
+- qi_flush_piotlb(iommu, did, pasid, 0, -1, 0);
+- else
+- iommu->flush.flush_iotlb(iommu, did, 0, 0, DMA_TLB_DSI_FLUSH);
++ iotlb_invalidation_with_pasid(iommu, did, pasid);
+
+ /* Device IOTLB doesn't need to be flushed in caching mode. */
+ if (!cap_caching_mode(iommu->cap))
+@@ -532,7 +540,7 @@ static void pasid_flush_caches(struct intel_iommu *iommu,
+
+ if (cap_caching_mode(iommu->cap)) {
+ pasid_cache_invalidation_with_pasid(iommu, did, pasid);
+- qi_flush_piotlb(iommu, did, pasid, 0, -1, 0);
++ iotlb_invalidation_with_pasid(iommu, did, pasid);
+ } else {
+ iommu_flush_write_buffer(iommu);
+ }
+@@ -669,8 +677,7 @@ int intel_pasid_setup_second_level(struct intel_iommu *iommu,
+ * Since it is a second level only translation setup, we should
+ * set SRE bit as well (addresses are expected to be GPAs).
+ */
+- if (pasid != PASID_RID2PASID && ecap_srs(iommu->ecap))
+- pasid_set_sre(pte);
++ pasid_set_sre(pte);
+ pasid_set_present(pte);
+ pasid_flush_caches(iommu, pte, pasid, did);
+
+@@ -704,8 +711,7 @@ int intel_pasid_setup_pass_through(struct intel_iommu *iommu,
+ * We should set SRE bit as well since the addresses are expected
+ * to be GPAs.
+ */
+- if (ecap_srs(iommu->ecap))
+- pasid_set_sre(pte);
++ pasid_set_sre(pte);
+ pasid_set_present(pte);
+ pasid_flush_caches(iommu, pte, pasid, did);
+
+diff --git a/drivers/iommu/intel/pasid.h b/drivers/iommu/intel/pasid.h
+index 35963e6bf9fa..086ebd697319 100644
+--- a/drivers/iommu/intel/pasid.h
++++ b/drivers/iommu/intel/pasid.h
+@@ -28,12 +28,12 @@
+ #define VCMD_CMD_ALLOC 0x1
+ #define VCMD_CMD_FREE 0x2
+ #define VCMD_VRSP_IP 0x1
+-#define VCMD_VRSP_SC(e) (((e) & 0xff) >> 1)
++#define VCMD_VRSP_SC(e) (((e) >> 1) & 0x3)
+ #define VCMD_VRSP_SC_SUCCESS 0
+-#define VCMD_VRSP_SC_NO_PASID_AVAIL 16
+-#define VCMD_VRSP_SC_INVALID_PASID 16
+-#define VCMD_VRSP_RESULT_PASID(e) (((e) >> 16) & 0xfffff)
+-#define VCMD_CMD_OPERAND(e) ((e) << 16)
++#define VCMD_VRSP_SC_NO_PASID_AVAIL 2
++#define VCMD_VRSP_SC_INVALID_PASID 2
++#define VCMD_VRSP_RESULT_PASID(e) (((e) >> 8) & 0xfffff)
++#define VCMD_CMD_OPERAND(e) ((e) << 8)
+ /*
+ * Domain ID reserved for pasid entries programmed for first-level
+ * only and pass-through transfer modes.
+@@ -99,12 +99,6 @@ static inline bool pasid_pte_is_present(struct pasid_entry *pte)
+ return READ_ONCE(pte->val[0]) & PASID_PTE_PRESENT;
+ }
+
+-/* Get PGTT field of a PASID table entry */
+-static inline u16 pasid_pte_get_pgtt(struct pasid_entry *pte)
+-{
+- return (u16)((READ_ONCE(pte->val[0]) >> 6) & 0x7);
+-}
+-
+ extern unsigned int intel_pasid_max_id;
+ int intel_pasid_alloc_id(void *ptr, int start, int end, gfp_t gfp);
+ void intel_pasid_free_id(u32 pasid);
+diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c
+index 0b7f9e39ce3b..4260bb089b2c 100644
+--- a/drivers/iommu/intel/svm.c
++++ b/drivers/iommu/intel/svm.c
+@@ -17,37 +17,17 @@
+ #include
+ #include
+ #include
+-#include
+ #include
+ #include
+ #include
+
+ #include "pasid.h"
+-#include "../iommu-sva-lib.h"
+
+ static irqreturn_t prq_event_thread(int irq, void *d);
+ static void intel_svm_drain_prq(struct device *dev, u32 pasid);
+-#define to_intel_svm_dev(handle) container_of(handle, struct intel_svm_dev, sva)
+
+ #define PRQ_ORDER 0
+
+-static DEFINE_XARRAY_ALLOC(pasid_private_array);
+-static int pasid_private_add(ioasid_t pasid, void *priv)
+-{
+- return xa_alloc(&pasid_private_array, &pasid, priv,
+- XA_LIMIT(pasid, pasid), GFP_ATOMIC);
+-}
+-
+-static void pasid_private_remove(ioasid_t pasid)
+-{
+- xa_erase(&pasid_private_array, pasid);
+-}
+-
+-static void *pasid_private_find(ioasid_t pasid)
+-{
+- return xa_load(&pasid_private_array, pasid);
+-}
+-
+ int intel_svm_enable_prq(struct intel_iommu *iommu)
+ {
+ struct page *pages;
+@@ -143,16 +123,53 @@ static void __flush_svm_range_dev(struct intel_svm *svm,
+ unsigned long address,
+ unsigned long pages, int ih)
+ {
+- struct device_domain_info *info = get_domain_info(sdev->dev);
+-
+- if (WARN_ON(!pages))
+- return;
++ struct qi_desc desc;
+
+- qi_flush_piotlb(sdev->iommu, sdev->did, svm->pasid, address, pages, ih);
+- if (info->ats_enabled)
+- qi_flush_dev_iotlb_pasid(sdev->iommu, sdev->sid, info->pfsid,
+- svm->pasid, sdev->qdep, address,
+- order_base_2(pages));
++ if (pages == -1) {
++ desc.qw0 = QI_EIOTLB_PASID(svm->pasid) |
++ QI_EIOTLB_DID(sdev->did) |
++ QI_EIOTLB_GRAN(QI_GRAN_NONG_PASID) |
++ QI_EIOTLB_TYPE;
++ desc.qw1 = 0;
++ } else {
++ int mask = ilog2(__roundup_pow_of_two(pages));
++
++ desc.qw0 = QI_EIOTLB_PASID(svm->pasid) |
++ QI_EIOTLB_DID(sdev->did) |
++ QI_EIOTLB_GRAN(QI_GRAN_PSI_PASID) |
++ QI_EIOTLB_TYPE;
++ desc.qw1 = QI_EIOTLB_ADDR(address) |
++ QI_EIOTLB_IH(ih) |
++ QI_EIOTLB_AM(mask);
++ }
++ desc.qw2 = 0;
++ desc.qw3 = 0;
++ qi_submit_sync(sdev->iommu, &desc, 1, 0);
++
++ if (sdev->dev_iotlb) {
++ desc.qw0 = QI_DEV_EIOTLB_PASID(svm->pasid) |
++ QI_DEV_EIOTLB_SID(sdev->sid) |
++ QI_DEV_EIOTLB_QDEP(sdev->qdep) |
++ QI_DEIOTLB_TYPE;
++ if (pages == -1) {
++ desc.qw1 = QI_DEV_EIOTLB_ADDR(-1ULL >> 1) |
++ QI_DEV_EIOTLB_SIZE;
++ } else if (pages > 1) {
++ /* The least significant zero bit indicates the size. So,
++ * for example, an "address" value of 0x12345f000 will
++ * flush from 0x123440000 to 0x12347ffff (256KiB). */
++ unsigned long last = address + ((unsigned long)(pages - 1) << VTD_PAGE_SHIFT);
++ unsigned long mask = __rounddown_pow_of_two(address ^ last);
++
++ desc.qw1 = QI_DEV_EIOTLB_ADDR((address & ~mask) |
++ (mask - 1)) | QI_DEV_EIOTLB_SIZE;
++ } else {
++ desc.qw1 = QI_DEV_EIOTLB_ADDR(address);
++ }
++ desc.qw2 = 0;
++ desc.qw3 = 0;
++ qi_submit_sync(sdev->iommu, &desc, 1, 0);
++ }
+ }
+
+ static void intel_flush_svm_range_dev(struct intel_svm *svm,
+@@ -224,6 +241,7 @@ static const struct mmu_notifier_ops intel_mmuops = {
+ };
+
+ static DEFINE_MUTEX(pasid_mutex);
++static LIST_HEAD(global_svm_list);
+
+ #define for_each_svm_dev(sdev, svm, d) \
+ list_for_each_entry((sdev), &(svm)->devs, list) \
+@@ -243,7 +261,7 @@ static int pasid_to_svm_sdev(struct device *dev, unsigned int pasid,
+ if (pasid == INVALID_IOASID || pasid >= PASID_MAX)
+ return -EINVAL;
+
+- svm = pasid_private_find(pasid);
++ svm = ioasid_find(NULL, pasid, NULL);
+ if (IS_ERR(svm))
+ return PTR_ERR(svm);
+
+@@ -353,7 +371,7 @@ int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev,
+ svm->gpasid = data->gpasid;
+ svm->flags |= SVM_FLAG_GUEST_PASID;
+ }
+- pasid_private_add(data->hpasid, svm);
++ ioasid_set_data(data->hpasid, svm);
+ INIT_LIST_HEAD_RCU(&svm->devs);
+ mmput(svm->mm);
+ }
+@@ -407,7 +425,7 @@ int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev,
+ list_add_rcu(&sdev->list, &svm->devs);
+ out:
+ if (!IS_ERR_OR_NULL(svm) && list_empty(&svm->devs)) {
+- pasid_private_remove(data->hpasid);
++ ioasid_set_data(data->hpasid, NULL);
+ kfree(svm);
+ }
+
+@@ -450,7 +468,7 @@ int intel_svm_unbind_gpasid(struct device *dev, u32 pasid)
+ * the unbind, IOMMU driver will get notified
+ * and perform cleanup.
+ */
+- pasid_private_remove(pasid);
++ ioasid_set_data(pasid, NULL);
+ kfree(svm);
+ }
+ }
+@@ -460,75 +478,106 @@ int intel_svm_unbind_gpasid(struct device *dev, u32 pasid)
+ return ret;
+ }
+
+-static int intel_svm_alloc_pasid(struct device *dev, struct mm_struct *mm,
+- unsigned int flags)
++static void _load_pasid(void *unused)
+ {
+- ioasid_t max_pasid = dev_is_pci(dev) ?
+- pci_max_pasids(to_pci_dev(dev)) : intel_pasid_max_id;
++ update_pasid();
++}
++
++static void load_pasid(struct mm_struct *mm, u32 pasid)
++{
++ mutex_lock(&mm->context.lock);
++
++ /* Synchronize with READ_ONCE in update_pasid(). */
++ smp_store_release(&mm->pasid, pasid);
+
+- return iommu_sva_alloc_pasid(mm, PASID_MIN, max_pasid - 1);
++ /* Update PASID MSR on all CPUs running the mm's tasks. */
++ on_each_cpu_mask(mm_cpumask(mm), _load_pasid, NULL, true);
++
++ mutex_unlock(&mm->context.lock);
+ }
+
+-static struct iommu_sva *intel_svm_bind_mm(struct intel_iommu *iommu,
+- struct device *dev,
+- struct mm_struct *mm,
+- unsigned int flags)
++/* Caller must hold pasid_mutex, mm reference */
++static int
++intel_svm_bind_mm(struct device *dev, unsigned int flags,
++ struct svm_dev_ops *ops,
++ struct mm_struct *mm, struct intel_svm_dev **sd)
+ {
+- struct device_domain_info *info = get_domain_info(dev);
+- unsigned long iflags, sflags;
++ struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
++ struct device_domain_info *info;
+ struct intel_svm_dev *sdev;
+- struct intel_svm *svm;
+- int ret = 0;
++ struct intel_svm *svm = NULL;
++ unsigned long iflags;
++ int pasid_max;
++ int ret;
+
+- svm = pasid_private_find(mm->pasid);
+- if (!svm) {
+- svm = kzalloc(sizeof(*svm), GFP_KERNEL);
+- if (!svm)
+- return ERR_PTR(-ENOMEM);
++ if (!iommu || dmar_disabled)
++ return -EINVAL;
+
+- svm->pasid = mm->pasid;
+- svm->mm = mm;
+- svm->flags = flags;
+- INIT_LIST_HEAD_RCU(&svm->devs);
++ if (!intel_svm_capable(iommu))
++ return -ENOTSUPP;
+
+- if (!(flags & SVM_FLAG_SUPERVISOR_MODE)) {
+- svm->notifier.ops = &intel_mmuops;
+- ret = mmu_notifier_register(&svm->notifier, mm);
+- if (ret) {
+- kfree(svm);
+- return ERR_PTR(ret);
+- }
+- }
++ if (dev_is_pci(dev)) {
++ pasid_max = pci_max_pasids(to_pci_dev(dev));
++ if (pasid_max < 0)
++ return -EINVAL;
++ } else
++ pasid_max = 1 << 20;
+
+- ret = pasid_private_add(svm->pasid, svm);
+- if (ret) {
+- if (svm->notifier.ops)
+- mmu_notifier_unregister(&svm->notifier, mm);
+- kfree(svm);
+- return ERR_PTR(ret);
++ /* Bind supervisor PASID shuld have mm = NULL */
++ if (flags & SVM_FLAG_SUPERVISOR_MODE) {
++ if (!ecap_srs(iommu->ecap) || mm) {
++ pr_err("Supervisor PASID with user provided mm.\n");
++ return -EINVAL;
+ }
+ }
+
+- /* Find the matching device in svm list */
+- for_each_svm_dev(sdev, svm, dev) {
+- sdev->users++;
+- goto success;
++ if (!(flags & SVM_FLAG_PRIVATE_PASID)) {
++ struct intel_svm *t;
++
++ list_for_each_entry(t, &global_svm_list, list) {
++ if (t->mm != mm || (t->flags & SVM_FLAG_PRIVATE_PASID))
++ continue;
++
++ svm = t;
++ if (svm->pasid >= pasid_max) {
++ dev_warn(dev,
++ "Limited PASID width. Cannot use existing PASID %d\n",
++ svm->pasid);
++ ret = -ENOSPC;
++ goto out;
++ }
++
++ /* Find the matching device in svm list */
++ for_each_svm_dev(sdev, svm, dev) {
++ if (sdev->ops != ops) {
++ ret = -EBUSY;
++ goto out;
++ }
++ sdev->users++;
++ goto success;
++ }
++
++ break;
++ }
+ }
+
+ sdev = kzalloc(sizeof(*sdev), GFP_KERNEL);
+ if (!sdev) {
+ ret = -ENOMEM;
+- goto free_svm;
++ goto out;
+ }
+-
+ sdev->dev = dev;
+ sdev->iommu = iommu;
++
++ ret = intel_iommu_enable_pasid(iommu, dev);
++ if (ret) {
++ kfree(sdev);
++ goto out;
++ }
++
++ info = get_domain_info(dev);
+ sdev->did = FLPT_DEFAULT_DID;
+ sdev->sid = PCI_DEVID(info->bus, info->devfn);
+- sdev->users = 1;
+- sdev->pasid = svm->pasid;
+- sdev->sva.dev = dev;
+- init_rcu_head(&sdev->rcu);
+ if (info->ats_enabled) {
+ sdev->dev_iotlb = 1;
+ sdev->qdep = info->ats_qdep;
+@@ -536,33 +585,96 @@ static struct iommu_sva *intel_svm_bind_mm(struct intel_iommu *iommu,
+ sdev->qdep = 0;
+ }
+
+- /* Setup the pasid table: */
+- sflags = (flags & SVM_FLAG_SUPERVISOR_MODE) ?
+- PASID_FLAG_SUPERVISOR_MODE : 0;
+- sflags |= cpu_feature_enabled(X86_FEATURE_LA57) ? PASID_FLAG_FL5LP : 0;
+- spin_lock_irqsave(&iommu->lock, iflags);
+- ret = intel_pasid_setup_first_level(iommu, dev, mm->pgd, mm->pasid,
+- FLPT_DEFAULT_DID, sflags);
+- spin_unlock_irqrestore(&iommu->lock, iflags);
++ /* Finish the setup now we know we're keeping it */
++ sdev->users = 1;
++ sdev->ops = ops;
++ init_rcu_head(&sdev->rcu);
+
+- if (ret)
+- goto free_sdev;
++ if (!svm) {
++ svm = kzalloc(sizeof(*svm), GFP_KERNEL);
++ if (!svm) {
++ ret = -ENOMEM;
++ kfree(sdev);
++ goto out;
++ }
+
++ if (pasid_max > intel_pasid_max_id)
++ pasid_max = intel_pasid_max_id;
++
++ /* Do not use PASID 0, reserved for RID to PASID */
++ svm->pasid = ioasid_alloc(NULL, PASID_MIN,
++ pasid_max - 1, svm);
++ if (svm->pasid == INVALID_IOASID) {
++ kfree(svm);
++ kfree(sdev);
++ ret = -ENOSPC;
++ goto out;
++ }
++ svm->notifier.ops = &intel_mmuops;
++ svm->mm = mm;
++ svm->flags = flags;
++ INIT_LIST_HEAD_RCU(&svm->devs);
++ INIT_LIST_HEAD(&svm->list);
++ ret = -ENOMEM;
++ if (mm) {
++ ret = mmu_notifier_register(&svm->notifier, mm);
++ if (ret) {
++ ioasid_put(svm->pasid);
++ kfree(svm);
++ kfree(sdev);
++ goto out;
++ }
++ }
++
++ spin_lock_irqsave(&iommu->lock, iflags);
++ ret = intel_pasid_setup_first_level(iommu, dev,
++ mm ? mm->pgd : init_mm.pgd,
++ svm->pasid, FLPT_DEFAULT_DID,
++ (mm ? 0 : PASID_FLAG_SUPERVISOR_MODE) |
++ (cpu_feature_enabled(X86_FEATURE_LA57) ?
++ PASID_FLAG_FL5LP : 0));
++ spin_unlock_irqrestore(&iommu->lock, iflags);
++ if (ret) {
++ if (mm)
++ mmu_notifier_unregister(&svm->notifier, mm);
++ ioasid_put(svm->pasid);
++ kfree(svm);
++ kfree(sdev);
++ goto out;
++ }
++
++ list_add_tail(&svm->list, &global_svm_list);
++ if (mm) {
++ /* The newly allocated pasid is loaded to the mm. */
++ load_pasid(mm, svm->pasid);
++ }
++ } else {
++ /*
++ * Binding a new device with existing PASID, need to setup
++ * the PASID entry.
++ */
++ spin_lock_irqsave(&iommu->lock, iflags);
++ ret = intel_pasid_setup_first_level(iommu, dev,
++ mm ? mm->pgd : init_mm.pgd,
++ svm->pasid, FLPT_DEFAULT_DID,
++ (mm ? 0 : PASID_FLAG_SUPERVISOR_MODE) |
++ (cpu_feature_enabled(X86_FEATURE_LA57) ?
++ PASID_FLAG_FL5LP : 0));
++ spin_unlock_irqrestore(&iommu->lock, iflags);
++ if (ret) {
++ kfree(sdev);
++ goto out;
++ }
++ }
+ list_add_rcu(&sdev->list, &svm->devs);
+ success:
+- return &sdev->sva;
+-
+-free_sdev:
+- kfree(sdev);
+-free_svm:
+- if (list_empty(&svm->devs)) {
+- if (svm->notifier.ops)
+- mmu_notifier_unregister(&svm->notifier, mm);
+- pasid_private_remove(mm->pasid);
+- kfree(svm);
+- }
+-
+- return ERR_PTR(ret);
++ sdev->pasid = svm->pasid;
++ sdev->sva.dev = dev;
++ if (sd)
++ *sd = sdev;
++ ret = 0;
++out:
++ return ret;
+ }
+
+ /* Caller must hold pasid_mutex */
+@@ -571,7 +683,6 @@ static int intel_svm_unbind_mm(struct device *dev, u32 pasid)
+ struct intel_svm_dev *sdev;
+ struct intel_iommu *iommu;
+ struct intel_svm *svm;
+- struct mm_struct *mm;
+ int ret = -EINVAL;
+
+ iommu = device_to_iommu(dev, NULL, NULL);
+@@ -581,7 +692,6 @@ static int intel_svm_unbind_mm(struct device *dev, u32 pasid)
+ ret = pasid_to_svm_sdev(dev, pasid, &svm, &sdev);
+ if (ret)
+ goto out;
+- mm = svm->mm;
+
+ if (sdev) {
+ sdev->users--;
+@@ -600,9 +710,13 @@ static int intel_svm_unbind_mm(struct device *dev, u32 pasid)
+ kfree_rcu(sdev, rcu);
+
+ if (list_empty(&svm->devs)) {
+- if (svm->notifier.ops)
+- mmu_notifier_unregister(&svm->notifier, mm);
+- pasid_private_remove(svm->pasid);
++ ioasid_put(svm->pasid);
++ if (svm->mm) {
++ mmu_notifier_unregister(&svm->notifier, svm->mm);
++ /* Clear mm's pasid. */
++ load_pasid(svm->mm, PASID_DISABLED);
++ }
++ list_del(&svm->list);
+ /* We mandate that no page faults may be outstanding
+ * for the PASID when intel_svm_unbind_mm() is called.
+ * If that is not obeyed, subtle errors will happen.
+@@ -858,7 +972,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
+ }
+ if (!svm || svm->pasid != req->pasid) {
+ rcu_read_lock();
+- svm = pasid_private_find(req->pasid);
++ svm = ioasid_find(NULL, req->pasid, NULL);
+ /* It *can't* go away, because the driver is not permitted
+ * to unbind the mm while any page faults are outstanding.
+ * So we only need RCU to protect the internal idr code. */
+@@ -929,6 +1043,13 @@ static irqreturn_t prq_event_thread(int irq, void *d)
+ mmap_read_unlock(svm->mm);
+ mmput(svm->mm);
+ bad_req:
++ WARN_ON(!sdev);
++ if (sdev && sdev->ops && sdev->ops->fault_cb) {
++ int rwxp = (req->rd_req << 3) | (req->wr_req << 2) |
++ (req->exe_req << 1) | (req->pm_req);
++ sdev->ops->fault_cb(sdev->dev, req->pasid, req->addr,
++ req->priv_data, rwxp, result);
++ }
+ /* We get here in the error case where the PASID lookup failed,
+ and these can be NULL. Do not use them below this point! */
+ sdev = NULL;
+@@ -986,40 +1107,31 @@ static irqreturn_t prq_event_thread(int irq, void *d)
+ return IRQ_RETVAL(handled);
+ }
+
+-struct iommu_sva *intel_svm_bind(struct device *dev, struct mm_struct *mm, void *drvdata)
++#define to_intel_svm_dev(handle) container_of(handle, struct intel_svm_dev, sva)
++struct iommu_sva *
++intel_svm_bind(struct device *dev, struct mm_struct *mm, void *drvdata)
+ {
+- struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
++ struct iommu_sva *sva = ERR_PTR(-EINVAL);
++ struct intel_svm_dev *sdev = NULL;
+ unsigned int flags = 0;
+- struct iommu_sva *sva;
+ int ret;
+
++ /*
++ * TODO: Consolidate with generic iommu-sva bind after it is merged.
++ * It will require shared SVM data structures, i.e. combine io_mm
++ * and intel_svm etc.
++ */
+ if (drvdata)
+ flags = *(unsigned int *)drvdata;
+-
+- if (flags & SVM_FLAG_SUPERVISOR_MODE) {
+- if (!ecap_srs(iommu->ecap)) {
+- dev_err(dev, "%s: Supervisor PASID not supported\n",
+- iommu->name);
+- return ERR_PTR(-EOPNOTSUPP);
+- }
+-
+- if (mm) {
+- dev_err(dev, "%s: Supervisor PASID with user provided mm\n",
+- iommu->name);
+- return ERR_PTR(-EINVAL);
+- }
+-
+- mm = &init_mm;
+- }
+-
+ mutex_lock(&pasid_mutex);
+- ret = intel_svm_alloc_pasid(dev, mm, flags);
+- if (ret) {
+- mutex_unlock(&pasid_mutex);
+- return ERR_PTR(ret);
+- }
++ ret = intel_svm_bind_mm(dev, flags, NULL, mm, &sdev);
++ if (ret)
++ sva = ERR_PTR(ret);
++ else if (sdev)
++ sva = &sdev->sva;
++ else
++ WARN(!sdev, "SVM bind succeeded with no sdev!\n");
+
+- sva = intel_svm_bind_mm(iommu, dev, mm, flags);
+ mutex_unlock(&pasid_mutex);
+
+ return sva;
+@@ -1027,9 +1139,10 @@ struct iommu_sva *intel_svm_bind(struct device *dev, struct mm_struct *mm, void
+
+ void intel_svm_unbind(struct iommu_sva *sva)
+ {
+- struct intel_svm_dev *sdev = to_intel_svm_dev(sva);
++ struct intel_svm_dev *sdev;
+
+ mutex_lock(&pasid_mutex);
++ sdev = to_intel_svm_dev(sva);
+ intel_svm_unbind_mm(sdev->dev, sdev->pasid);
+ mutex_unlock(&pasid_mutex);
+ }
+diff --git a/drivers/iommu/io-pgfault.c b/drivers/iommu/io-pgfault.c
+index 1df8c1dcae77..8fd03a24cb14 100644
+--- a/drivers/iommu/io-pgfault.c
++++ b/drivers/iommu/io-pgfault.c
+@@ -12,6 +12,7 @@
+ #include
+
+ #include "iommu-sva-lib.h"
++#include "linux/vendor/sva_ext.h"
+
+ /**
+ * struct iopf_queue - IO Page Fault queue
+@@ -118,6 +119,11 @@ iopf_handle_single(struct iopf_fault *iopf)
+ status = ret & VM_FAULT_ERROR ? IOMMU_PAGE_RESP_INVALID :
+ IOMMU_PAGE_RESP_SUCCESS;
+
++ if (status == IOMMU_PAGE_RESP_SUCCESS) {
++ unsigned long aligned_addr = prm->addr & PAGE_MASK;
++ svm_flush_cache(vma->vm_mm, aligned_addr, PAGE_SIZE);
++ }
++
+ out_put_mm:
+ mmap_read_unlock(mm);
+ mmput(mm);
+diff --git a/drivers/iommu/io-pgtable-arm-v7s.c b/drivers/iommu/io-pgtable-arm-v7s.c
+index 701efdbdc12b..3cf72c100add 100644
+--- a/drivers/iommu/io-pgtable-arm-v7s.c
++++ b/drivers/iommu/io-pgtable-arm-v7s.c
+@@ -242,17 +242,13 @@ static void *__arm_v7s_alloc_table(int lvl, gfp_t gfp,
+ __GFP_ZERO | ARM_V7S_TABLE_GFP_DMA, get_order(size));
+ else if (lvl == 2)
+ table = kmem_cache_zalloc(data->l2_tables, gfp);
+-
+- if (!table)
+- return NULL;
+-
+ phys = virt_to_phys(table);
+ if (phys != (arm_v7s_iopte)phys) {
+ /* Doesn't fit in PTE */
+ dev_err(dev, "Page table does not fit in PTE: %pa", &phys);
+ goto out_free;
+ }
+- if (!cfg->coherent_walk) {
++ if (table && !cfg->coherent_walk) {
+ dma = dma_map_single(dev, table, size, DMA_TO_DEVICE);
+ if (dma_mapping_error(dev, dma))
+ goto out_free;
+diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c
+index 3fc6ae00dc96..34fea518785b 100644
+--- a/drivers/iommu/io-pgtable-arm.c
++++ b/drivers/iommu/io-pgtable-arm.c
+@@ -72,19 +72,16 @@
+
+ #define ARM_LPAE_PTE_NSTABLE (((arm_lpae_iopte)1) << 63)
+ #define ARM_LPAE_PTE_XN (((arm_lpae_iopte)3) << 53)
+-#define ARM_LPAE_PTE_DBM (((arm_lpae_iopte)1) << 51)
+ #define ARM_LPAE_PTE_AF (((arm_lpae_iopte)1) << 10)
+ #define ARM_LPAE_PTE_SH_NS (((arm_lpae_iopte)0) << 8)
+ #define ARM_LPAE_PTE_SH_OS (((arm_lpae_iopte)2) << 8)
+ #define ARM_LPAE_PTE_SH_IS (((arm_lpae_iopte)3) << 8)
+ #define ARM_LPAE_PTE_NS (((arm_lpae_iopte)1) << 5)
+ #define ARM_LPAE_PTE_VALID (((arm_lpae_iopte)1) << 0)
+-/* Block descriptor bits */
+-#define ARM_LPAE_PTE_NT (((arm_lpae_iopte)1) << 16)
+
+ #define ARM_LPAE_PTE_ATTR_LO_MASK (((arm_lpae_iopte)0x3ff) << 2)
+ /* Ignore the contiguous bit for block splitting */
+-#define ARM_LPAE_PTE_ATTR_HI_MASK (((arm_lpae_iopte)13) << 51)
++#define ARM_LPAE_PTE_ATTR_HI_MASK (((arm_lpae_iopte)6) << 52)
+ #define ARM_LPAE_PTE_ATTR_MASK (ARM_LPAE_PTE_ATTR_LO_MASK | \
+ ARM_LPAE_PTE_ATTR_HI_MASK)
+ /* Software bit for solving coherency races */
+@@ -305,12 +302,11 @@ static int arm_lpae_init_pte(struct arm_lpae_io_pgtable *data,
+ static arm_lpae_iopte arm_lpae_install_table(arm_lpae_iopte *table,
+ arm_lpae_iopte *ptep,
+ arm_lpae_iopte curr,
+- struct arm_lpae_io_pgtable *data)
++ struct io_pgtable_cfg *cfg)
+ {
+ arm_lpae_iopte old, new;
+- struct io_pgtable_cfg *cfg = &data->iop.cfg;
+
+- new = paddr_to_iopte(__pa(table), data) | ARM_LPAE_PTE_TYPE_TABLE;
++ new = __pa(table) | ARM_LPAE_PTE_TYPE_TABLE;
+ if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_NS)
+ new |= ARM_LPAE_PTE_NSTABLE;
+
+@@ -361,7 +357,7 @@ static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova,
+ if (!cptep)
+ return -ENOMEM;
+
+- pte = arm_lpae_install_table(cptep, ptep, 0, data);
++ pte = arm_lpae_install_table(cptep, ptep, 0, cfg);
+ if (pte)
+ __arm_lpae_free_pages(cptep, tblsz, cfg);
+ } else if (!cfg->coherent_walk && !(pte & ARM_LPAE_PTE_SW_SYNC)) {
+@@ -383,7 +379,6 @@ static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova,
+ static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data,
+ int prot)
+ {
+- struct io_pgtable_cfg *cfg = &data->iop.cfg;
+ arm_lpae_iopte pte;
+
+ if (data->iop.fmt == ARM_64_LPAE_S1 ||
+@@ -391,10 +386,6 @@ static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data,
+ pte = ARM_LPAE_PTE_nG;
+ if (!(prot & IOMMU_WRITE) && (prot & IOMMU_READ))
+ pte |= ARM_LPAE_PTE_AP_RDONLY;
+- else if (data->iop.fmt == ARM_64_LPAE_S1 &&
+- cfg->quirks & IO_PGTABLE_QUIRK_ARM_HD)
+- pte |= ARM_LPAE_PTE_DBM;
+-
+ if (!(prot & IOMMU_PRIV))
+ pte |= ARM_LPAE_PTE_AP_UNPRIV;
+ } else {
+@@ -555,7 +546,7 @@ static size_t arm_lpae_split_blk_unmap(struct arm_lpae_io_pgtable *data,
+ __arm_lpae_init_pte(data, blk_paddr, pte, lvl, &tablep[i]);
+ }
+
+- pte = arm_lpae_install_table(tablep, ptep, blk_pte, data);
++ pte = arm_lpae_install_table(tablep, ptep, blk_pte, cfg);
+ if (pte != blk_pte) {
+ __arm_lpae_free_pages(tablep, tablesz, cfg);
+ /*
+@@ -683,382 +674,6 @@ static phys_addr_t arm_lpae_iova_to_phys(struct io_pgtable_ops *ops,
+ return iopte_to_paddr(pte, data) | iova;
+ }
+
+-static size_t __arm_lpae_split_block(struct arm_lpae_io_pgtable *data,
+- unsigned long iova, size_t size, int lvl,
+- arm_lpae_iopte *ptep);
+-
+-static size_t arm_lpae_do_split_blk(struct arm_lpae_io_pgtable *data,
+- unsigned long iova, size_t size,
+- arm_lpae_iopte blk_pte, int lvl,
+- arm_lpae_iopte *ptep)
+-{
+- struct io_pgtable_cfg *cfg = &data->iop.cfg;
+- arm_lpae_iopte pte, *tablep;
+- phys_addr_t blk_paddr;
+- size_t tablesz = ARM_LPAE_GRANULE(data);
+- size_t split_sz = ARM_LPAE_BLOCK_SIZE(lvl, data);
+- int i;
+-
+- if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS))
+- return 0;
+-
+- tablep = __arm_lpae_alloc_pages(tablesz, GFP_ATOMIC, cfg);
+- if (!tablep)
+- return 0;
+-
+- blk_paddr = iopte_to_paddr(blk_pte, data);
+- pte = iopte_prot(blk_pte);
+- for (i = 0; i < tablesz / sizeof(pte); i++, blk_paddr += split_sz)
+- __arm_lpae_init_pte(data, blk_paddr, pte, lvl, &tablep[i]);
+-
+- if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_BBML1) {
+- /* Race does not exist */
+- blk_pte |= ARM_LPAE_PTE_NT;
+- __arm_lpae_set_pte(ptep, blk_pte, cfg);
+- io_pgtable_tlb_flush_walk(&data->iop, iova, size, size);
+- }
+- /* Race does not exist */
+- pte = arm_lpae_install_table(tablep, ptep, blk_pte, data);
+-
+- /* Have splited it into page? */
+- if (lvl == (ARM_LPAE_MAX_LEVELS - 1))
+- return size;
+-
+- /* Go back to lvl - 1 */
+- ptep -= ARM_LPAE_LVL_IDX(iova, lvl - 1, data);
+- return __arm_lpae_split_block(data, iova, size, lvl - 1, ptep);
+-}
+-
+-static size_t __arm_lpae_split_block(struct arm_lpae_io_pgtable *data,
+- unsigned long iova, size_t size, int lvl,
+- arm_lpae_iopte *ptep)
+-{
+- arm_lpae_iopte pte;
+- struct io_pgtable *iop = &data->iop;
+- size_t base, next_size, total_size;
+-
+- if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS))
+- return 0;
+-
+- ptep += ARM_LPAE_LVL_IDX(iova, lvl, data);
+- pte = READ_ONCE(*ptep);
+- if (WARN_ON(!pte))
+- return 0;
+-
+- if (size == ARM_LPAE_BLOCK_SIZE(lvl, data)) {
+- if (iopte_leaf(pte, lvl, iop->fmt)) {
+- if (lvl == (ARM_LPAE_MAX_LEVELS - 1) ||
+- (pte & ARM_LPAE_PTE_AP_RDONLY))
+- return size;
+-
+- /* We find a writable block, split it. */
+- return arm_lpae_do_split_blk(data, iova, size, pte,
+- lvl + 1, ptep);
+- } else {
+- /* If it is the last table level, then nothing to do */
+- if (lvl == (ARM_LPAE_MAX_LEVELS - 2))
+- return size;
+-
+- total_size = 0;
+- next_size = ARM_LPAE_BLOCK_SIZE(lvl + 1, data);
+- ptep = iopte_deref(pte, data);
+- for (base = 0; base < size; base += next_size)
+- total_size += __arm_lpae_split_block(data,
+- iova + base, next_size, lvl + 1,
+- ptep);
+- return total_size;
+- }
+- } else if (iopte_leaf(pte, lvl, iop->fmt)) {
+- WARN(1, "Can't split behind a block.\n");
+- return 0;
+- }
+-
+- /* Keep on walkin */
+- ptep = iopte_deref(pte, data);
+- return __arm_lpae_split_block(data, iova, size, lvl + 1, ptep);
+-}
+-
+-static size_t arm_lpae_split_block(struct io_pgtable_ops *ops,
+- unsigned long iova, size_t size)
+-{
+- struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
+- struct io_pgtable_cfg *cfg = &data->iop.cfg;
+- arm_lpae_iopte *ptep = data->pgd;
+- int lvl = data->start_level;
+- long iaext = (s64)iova >> cfg->ias;
+-
+- if (WARN_ON(!size || (size & cfg->pgsize_bitmap) != size))
+- return 0;
+-
+- if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1)
+- iaext = ~iaext;
+- if (WARN_ON(iaext))
+- return 0;
+-
+- /* If it is smallest granule, then nothing to do */
+- if (size == ARM_LPAE_BLOCK_SIZE(ARM_LPAE_MAX_LEVELS - 1, data))
+- return size;
+-
+- return __arm_lpae_split_block(data, iova, size, lvl, ptep);
+-}
+-
+-static size_t __arm_lpae_merge_page(struct arm_lpae_io_pgtable *data,
+- unsigned long iova, phys_addr_t paddr,
+- size_t size, int lvl, arm_lpae_iopte *ptep,
+- arm_lpae_iopte prot)
+-{
+- arm_lpae_iopte pte, *tablep;
+- struct io_pgtable *iop = &data->iop;
+- struct io_pgtable_cfg *cfg = &data->iop.cfg;
+-
+- if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS))
+- return 0;
+-
+- ptep += ARM_LPAE_LVL_IDX(iova, lvl, data);
+- pte = READ_ONCE(*ptep);
+- if (WARN_ON(!pte))
+- return 0;
+-
+- if (size == ARM_LPAE_BLOCK_SIZE(lvl, data)) {
+- if (iopte_leaf(pte, lvl, iop->fmt))
+- return size;
+-
+- /* Race does not exist */
+- if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_BBML1) {
+- prot |= ARM_LPAE_PTE_NT;
+- __arm_lpae_init_pte(data, paddr, prot, lvl, ptep);
+- io_pgtable_tlb_flush_walk(iop, iova, size,
+- ARM_LPAE_GRANULE(data));
+-
+- prot &= ~(ARM_LPAE_PTE_NT);
+- __arm_lpae_init_pte(data, paddr, prot, lvl, ptep);
+- } else {
+- __arm_lpae_init_pte(data, paddr, prot, lvl, ptep);
+- }
+-
+- tablep = iopte_deref(pte, data);
+- __arm_lpae_free_pgtable(data, lvl + 1, tablep);
+- return size;
+- } else if (iopte_leaf(pte, lvl, iop->fmt)) {
+- /* The size is too small, already merged */
+- return size;
+- }
+-
+- /* Keep on walkin */
+- ptep = iopte_deref(pte, data);
+- return __arm_lpae_merge_page(data, iova, paddr, size, lvl + 1, ptep, prot);
+-}
+-
+-static size_t arm_lpae_merge_page(struct io_pgtable_ops *ops, unsigned long iova,
+- phys_addr_t paddr, size_t size, int iommu_prot)
+-{
+- struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
+- struct io_pgtable_cfg *cfg = &data->iop.cfg;
+- arm_lpae_iopte *ptep = data->pgd;
+- int lvl = data->start_level;
+- arm_lpae_iopte prot;
+- long iaext = (s64)iova >> cfg->ias;
+-
+- if (WARN_ON(!size || (size & cfg->pgsize_bitmap) != size))
+- return 0;
+-
+- if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1)
+- iaext = ~iaext;
+- if (WARN_ON(iaext || paddr >> cfg->oas))
+- return 0;
+-
+- /* If no access, then nothing to do */
+- if (!(iommu_prot & (IOMMU_READ | IOMMU_WRITE)))
+- return size;
+-
+- /* If it is smallest granule, then nothing to do */
+- if (size == ARM_LPAE_BLOCK_SIZE(ARM_LPAE_MAX_LEVELS - 1, data))
+- return size;
+-
+- prot = arm_lpae_prot_to_pte(data, iommu_prot);
+- return __arm_lpae_merge_page(data, iova, paddr, size, lvl, ptep, prot);
+-}
+-
+-static int __arm_lpae_sync_dirty_log(struct arm_lpae_io_pgtable *data,
+- unsigned long iova, size_t size,
+- int lvl, arm_lpae_iopte *ptep,
+- unsigned long *bitmap,
+- unsigned long base_iova,
+- unsigned long bitmap_pgshift)
+-{
+- arm_lpae_iopte pte;
+- struct io_pgtable *iop = &data->iop;
+- size_t base, next_size;
+- unsigned long offset;
+- int nbits, ret;
+-
+- if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS))
+- return -EINVAL;
+-
+- ptep += ARM_LPAE_LVL_IDX(iova, lvl, data);
+- pte = READ_ONCE(*ptep);
+- if (WARN_ON(!pte))
+- return -EINVAL;
+-
+- if (size == ARM_LPAE_BLOCK_SIZE(lvl, data)) {
+- if (iopte_leaf(pte, lvl, iop->fmt)) {
+- if (pte & ARM_LPAE_PTE_AP_RDONLY)
+- return 0;
+-
+- /* It is writable, set the bitmap */
+- nbits = size >> bitmap_pgshift;
+- offset = (iova - base_iova) >> bitmap_pgshift;
+- bitmap_set(bitmap, offset, nbits);
+- return 0;
+- }
+- /* Current level is table, traverse next level */
+- next_size = ARM_LPAE_BLOCK_SIZE(lvl + 1, data);
+- ptep = iopte_deref(pte, data);
+- for (base = 0; base < size; base += next_size) {
+- ret = __arm_lpae_sync_dirty_log(data, iova + base,
+- next_size, lvl + 1, ptep, bitmap,
+- base_iova, bitmap_pgshift);
+- if (ret)
+- return ret;
+- }
+- return 0;
+- } else if (iopte_leaf(pte, lvl, iop->fmt)) {
+- if (pte & ARM_LPAE_PTE_AP_RDONLY)
+- return 0;
+-
+- /* Though the size is too small, also set bitmap */
+- nbits = size >> bitmap_pgshift;
+- offset = (iova - base_iova) >> bitmap_pgshift;
+- bitmap_set(bitmap, offset, nbits);
+- return 0;
+- }
+-
+- /* Keep on walkin */
+- ptep = iopte_deref(pte, data);
+- return __arm_lpae_sync_dirty_log(data, iova, size, lvl + 1, ptep,
+- bitmap, base_iova, bitmap_pgshift);
+-}
+-
+-static int arm_lpae_sync_dirty_log(struct io_pgtable_ops *ops,
+- unsigned long iova, size_t size,
+- unsigned long *bitmap,
+- unsigned long base_iova,
+- unsigned long bitmap_pgshift)
+-{
+- struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
+- struct io_pgtable_cfg *cfg = &data->iop.cfg;
+- arm_lpae_iopte *ptep = data->pgd;
+- int lvl = data->start_level;
+- long iaext = (s64)iova >> cfg->ias;
+-
+- if (WARN_ON(!size || (size & cfg->pgsize_bitmap) != size))
+- return -EINVAL;
+-
+- if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1)
+- iaext = ~iaext;
+- if (WARN_ON(iaext))
+- return -EINVAL;
+-
+- if (data->iop.fmt != ARM_64_LPAE_S1 &&
+- data->iop.fmt != ARM_32_LPAE_S1)
+- return -EINVAL;
+-
+- return __arm_lpae_sync_dirty_log(data, iova, size, lvl, ptep,
+- bitmap, base_iova, bitmap_pgshift);
+-}
+-
+-static int __arm_lpae_clear_dirty_log(struct arm_lpae_io_pgtable *data,
+- unsigned long iova, size_t size,
+- int lvl, arm_lpae_iopte *ptep,
+- unsigned long *bitmap,
+- unsigned long base_iova,
+- unsigned long bitmap_pgshift)
+-{
+- arm_lpae_iopte pte;
+- struct io_pgtable *iop = &data->iop;
+- unsigned long offset;
+- size_t base, next_size;
+- int nbits, ret, i;
+-
+- if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS))
+- return -EINVAL;
+-
+- ptep += ARM_LPAE_LVL_IDX(iova, lvl, data);
+- pte = READ_ONCE(*ptep);
+- if (WARN_ON(!pte))
+- return -EINVAL;
+-
+- if (size == ARM_LPAE_BLOCK_SIZE(lvl, data)) {
+- if (iopte_leaf(pte, lvl, iop->fmt)) {
+- if (pte & ARM_LPAE_PTE_AP_RDONLY)
+- return 0;
+-
+- /* Ensure all corresponding bits are set */
+- nbits = size >> bitmap_pgshift;
+- offset = (iova - base_iova) >> bitmap_pgshift;
+- for (i = offset; i < offset + nbits; i++) {
+- if (!test_bit(i, bitmap))
+- return 0;
+- }
+-
+- /* Race does not exist */
+- pte |= ARM_LPAE_PTE_AP_RDONLY;
+- __arm_lpae_set_pte(ptep, pte, &iop->cfg);
+- return 0;
+- }
+- /* Current level is table, traverse next level */
+- next_size = ARM_LPAE_BLOCK_SIZE(lvl + 1, data);
+- ptep = iopte_deref(pte, data);
+- for (base = 0; base < size; base += next_size) {
+- ret = __arm_lpae_clear_dirty_log(data, iova + base,
+- next_size, lvl + 1, ptep, bitmap,
+- base_iova, bitmap_pgshift);
+- if (ret)
+- return ret;
+- }
+- return 0;
+- } else if (iopte_leaf(pte, lvl, iop->fmt)) {
+- /* Though the size is too small, it is already clean */
+- if (pte & ARM_LPAE_PTE_AP_RDONLY)
+- return 0;
+-
+- return -EINVAL;
+- }
+-
+- /* Keep on walkin */
+- ptep = iopte_deref(pte, data);
+- return __arm_lpae_clear_dirty_log(data, iova, size, lvl + 1, ptep,
+- bitmap, base_iova, bitmap_pgshift);
+-}
+-
+-static int arm_lpae_clear_dirty_log(struct io_pgtable_ops *ops,
+- unsigned long iova, size_t size,
+- unsigned long *bitmap,
+- unsigned long base_iova,
+- unsigned long bitmap_pgshift)
+-{
+- struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
+- struct io_pgtable_cfg *cfg = &data->iop.cfg;
+- arm_lpae_iopte *ptep = data->pgd;
+- int lvl = data->start_level;
+- long iaext = (s64)iova >> cfg->ias;
+-
+- if (WARN_ON(!size || (size & cfg->pgsize_bitmap) != size))
+- return -EINVAL;
+-
+- if (cfg->quirks & IO_PGTABLE_QUIRK_ARM_TTBR1)
+- iaext = ~iaext;
+- if (WARN_ON(iaext))
+- return -EINVAL;
+-
+- if (data->iop.fmt != ARM_64_LPAE_S1 &&
+- data->iop.fmt != ARM_32_LPAE_S1)
+- return -EINVAL;
+-
+- return __arm_lpae_clear_dirty_log(data, iova, size, lvl, ptep,
+- bitmap, base_iova, bitmap_pgshift);
+-}
+-
+ static void arm_lpae_restrict_pgsizes(struct io_pgtable_cfg *cfg)
+ {
+ unsigned long granule, page_sizes;
+@@ -1137,10 +752,6 @@ arm_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg)
+ .map = arm_lpae_map,
+ .unmap = arm_lpae_unmap,
+ .iova_to_phys = arm_lpae_iova_to_phys,
+- .split_block = arm_lpae_split_block,
+- .merge_page = arm_lpae_merge_page,
+- .sync_dirty_log = arm_lpae_sync_dirty_log,
+- .clear_dirty_log = arm_lpae_clear_dirty_log,
+ };
+
+ return data;
+@@ -1156,10 +767,7 @@ arm_64_lpae_alloc_pgtable_s1(struct io_pgtable_cfg *cfg, void *cookie)
+
+ if (cfg->quirks & ~(IO_PGTABLE_QUIRK_ARM_NS |
+ IO_PGTABLE_QUIRK_NON_STRICT |
+- IO_PGTABLE_QUIRK_ARM_TTBR1 |
+- IO_PGTABLE_QUIRK_ARM_HD |
+- IO_PGTABLE_QUIRK_ARM_BBML1 |
+- IO_PGTABLE_QUIRK_ARM_BBML2))
++ IO_PGTABLE_QUIRK_ARM_TTBR1))
+ return NULL;
+
+ data = arm_lpae_alloc_pgtable(cfg);
+@@ -1256,10 +864,7 @@ arm_64_lpae_alloc_pgtable_s2(struct io_pgtable_cfg *cfg, void *cookie)
+ typeof(&cfg->arm_lpae_s2_cfg.vtcr) vtcr = &cfg->arm_lpae_s2_cfg.vtcr;
+
+ /* The NS quirk doesn't apply at stage 2 */
+- if (cfg->quirks & ~(IO_PGTABLE_QUIRK_NON_STRICT |
+- IO_PGTABLE_QUIRK_ARM_HD |
+- IO_PGTABLE_QUIRK_ARM_BBML1 |
+- IO_PGTABLE_QUIRK_ARM_BBML2))
++ if (cfg->quirks & ~(IO_PGTABLE_QUIRK_NON_STRICT))
+ return NULL;
+
+ data = arm_lpae_alloc_pgtable(cfg);
+diff --git a/drivers/iommu/ioasid.c b/drivers/iommu/ioasid.c
+index a786c034907c..50ee27bbd04e 100644
+--- a/drivers/iommu/ioasid.c
++++ b/drivers/iommu/ioasid.c
+@@ -2,7 +2,7 @@
+ /*
+ * I/O Address Space ID allocator. There is one global IOASID space, split into
+ * subsets. Users create a subset with DECLARE_IOASID_SET, then allocate and
+- * free IOASIDs with ioasid_alloc() and ioasid_free().
++ * free IOASIDs with ioasid_alloc and ioasid_put.
+ */
+ #include
+ #include
+@@ -15,6 +15,7 @@ struct ioasid_data {
+ struct ioasid_set *set;
+ void *private;
+ struct rcu_head rcu;
++ refcount_t refs;
+ };
+
+ /*
+@@ -314,6 +315,7 @@ ioasid_t ioasid_alloc(struct ioasid_set *set, ioasid_t min, ioasid_t max,
+
+ data->set = set;
+ data->private = private;
++ refcount_set(&data->refs, 1);
+
+ /*
+ * Custom allocator needs allocator data to perform platform specific
+@@ -346,11 +348,34 @@ ioasid_t ioasid_alloc(struct ioasid_set *set, ioasid_t min, ioasid_t max,
+ EXPORT_SYMBOL_GPL(ioasid_alloc);
+
+ /**
+- * ioasid_free - Free an ioasid
++ * ioasid_get - obtain a reference to the IOASID
++ */
++void ioasid_get(ioasid_t ioasid)
++{
++ struct ioasid_data *ioasid_data;
++
++ spin_lock(&ioasid_allocator_lock);
++ ioasid_data = xa_load(&active_allocator->xa, ioasid);
++ if (ioasid_data)
++ refcount_inc(&ioasid_data->refs);
++ else
++ WARN_ON(1);
++ spin_unlock(&ioasid_allocator_lock);
++}
++EXPORT_SYMBOL_GPL(ioasid_get);
++
++/**
++ * ioasid_put - Release a reference to an ioasid
+ * @ioasid: the ID to remove
++ *
++ * Put a reference to the IOASID, free it when the number of references drops to
++ * zero.
++ *
++ * Return: %true if the IOASID was freed, %false otherwise.
+ */
+-void ioasid_free(ioasid_t ioasid)
++bool ioasid_put(ioasid_t ioasid)
+ {
++ bool free = false;
+ struct ioasid_data *ioasid_data;
+
+ spin_lock(&ioasid_allocator_lock);
+@@ -360,6 +385,10 @@ void ioasid_free(ioasid_t ioasid)
+ goto exit_unlock;
+ }
+
++ free = refcount_dec_and_test(&ioasid_data->refs);
++ if (!free)
++ goto exit_unlock;
++
+ active_allocator->ops->free(ioasid, active_allocator->ops->pdata);
+ /* Custom allocator needs additional steps to free the xa element */
+ if (active_allocator->flags & IOASID_ALLOCATOR_CUSTOM) {
+@@ -369,8 +398,9 @@ void ioasid_free(ioasid_t ioasid)
+
+ exit_unlock:
+ spin_unlock(&ioasid_allocator_lock);
++ return free;
+ }
+-EXPORT_SYMBOL_GPL(ioasid_free);
++EXPORT_SYMBOL_GPL(ioasid_put);
+
+ /**
+ * ioasid_find - Find IOASID data
+diff --git a/drivers/iommu/iommu-sva-lib.c b/drivers/iommu/iommu-sva-lib.c
+index 106506143896..bd41405d34e9 100644
+--- a/drivers/iommu/iommu-sva-lib.c
++++ b/drivers/iommu/iommu-sva-lib.c
+@@ -18,7 +18,8 @@ static DECLARE_IOASID_SET(iommu_sva_pasid);
+ *
+ * Try to allocate a PASID for this mm, or take a reference to the existing one
+ * provided it fits within the [@min, @max] range. On success the PASID is
+- * available in mm->pasid and will be available for the lifetime of the mm.
++ * available in mm->pasid, and must be released with iommu_sva_free_pasid().
++ * @min must be greater than 0, because 0 indicates an unused mm->pasid.
+ *
+ * Returns 0 on success and < 0 on error.
+ */
+@@ -32,24 +33,38 @@ int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t max)
+ return -EINVAL;
+
+ mutex_lock(&iommu_sva_lock);
+- /* Is a PASID already associated with this mm? */
+- if (pasid_valid(mm->pasid)) {
+- if (mm->pasid < min || mm->pasid >= max)
++ if (mm->pasid) {
++ if (mm->pasid >= min && mm->pasid <= max)
++ ioasid_get(mm->pasid);
++ else
+ ret = -EOVERFLOW;
+- goto out;
++ } else {
++ pasid = ioasid_alloc(&iommu_sva_pasid, min, max, mm);
++ if (pasid == INVALID_IOASID)
++ ret = -ENOMEM;
++ else
++ mm->pasid = pasid;
+ }
+-
+- pasid = ioasid_alloc(&iommu_sva_pasid, min, max, mm);
+- if (!pasid_valid(pasid))
+- ret = -ENOMEM;
+- else
+- mm_pasid_set(mm, pasid);
+-out:
+ mutex_unlock(&iommu_sva_lock);
+ return ret;
+ }
+ EXPORT_SYMBOL_GPL(iommu_sva_alloc_pasid);
+
++/**
++ * iommu_sva_free_pasid - Release the mm's PASID
++ * @mm: the mm
++ *
++ * Drop one reference to a PASID allocated with iommu_sva_alloc_pasid()
++ */
++void iommu_sva_free_pasid(struct mm_struct *mm)
++{
++ mutex_lock(&iommu_sva_lock);
++ if (ioasid_put(mm->pasid))
++ mm->pasid = 0;
++ mutex_unlock(&iommu_sva_lock);
++}
++EXPORT_SYMBOL_GPL(iommu_sva_free_pasid);
++
+ /* ioasid_find getter() requires a void * argument */
+ static bool __mmget_not_zero(void *mm)
+ {
+diff --git a/drivers/iommu/iommu-sva-lib.h b/drivers/iommu/iommu-sva-lib.h
+index 8909ea1094e3..031155010ca8 100644
+--- a/drivers/iommu/iommu-sva-lib.h
++++ b/drivers/iommu/iommu-sva-lib.h
+@@ -9,6 +9,7 @@
+ #include
+
+ int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t max);
++void iommu_sva_free_pasid(struct mm_struct *mm);
+ struct mm_struct *iommu_sva_find(ioasid_t pasid);
+
+ /* I/O Page fault */
+@@ -16,7 +17,7 @@ struct device;
+ struct iommu_fault;
+ struct iopf_queue;
+
+-#ifdef CONFIG_IOMMU_SVA
++#ifdef CONFIG_IOMMU_SVA_LIB
+ int iommu_queue_iopf(struct iommu_fault *fault, void *cookie);
+
+ int iopf_queue_add_device(struct iopf_queue *queue, struct device *dev);
+@@ -27,7 +28,7 @@ struct iopf_queue *iopf_queue_alloc(const char *name);
+ void iopf_queue_free(struct iopf_queue *queue);
+ int iopf_queue_discard_partial(struct iopf_queue *queue);
+
+-#else /* CONFIG_IOMMU_SVA */
++#else /* CONFIG_IOMMU_SVA_LIB */
+ static inline int iommu_queue_iopf(struct iommu_fault *fault, void *cookie)
+ {
+ return -ENODEV;
+@@ -63,5 +64,5 @@ static inline int iopf_queue_discard_partial(struct iopf_queue *queue)
+ {
+ return -ENODEV;
+ }
+-#endif /* CONFIG_IOMMU_SVA */
++#endif /* CONFIG_IOMMU_SVA_LIB */
+ #endif /* _IOMMU_SVA_LIB_H */
+diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
+index b888efd65e92..c71f9321c87a 100644
+--- a/drivers/iommu/iommu.c
++++ b/drivers/iommu/iommu.c
+@@ -29,7 +29,7 @@ static struct kset *iommu_group_kset;
+ static DEFINE_IDA(iommu_group_ida);
+
+ static unsigned int iommu_def_domain_type __read_mostly;
+-static bool iommu_dma_strict __read_mostly;
++static bool iommu_dma_strict __read_mostly = true;
+ static u32 iommu_cmd_line __read_mostly;
+
+ /*
+@@ -198,14 +198,9 @@ static struct dev_iommu *dev_iommu_get(struct device *dev)
+
+ static void dev_iommu_free(struct device *dev)
+ {
+- struct dev_iommu *param = dev->iommu;
+-
++ iommu_fwspec_free(dev);
++ kfree(dev->iommu);
+ dev->iommu = NULL;
+- if (param->fwspec) {
+- fwnode_handle_put(param->fwspec->iommu_fwnode);
+- kfree(param->fwspec);
+- }
+- kfree(param);
+ }
+
+ static int __iommu_probe_device(struct device *dev, struct list_head *group_list)
+@@ -819,12 +814,6 @@ static bool iommu_is_attach_deferred(struct iommu_domain *domain,
+ return false;
+ }
+
+-void __acpi_device_create_direct_mappings(struct iommu_group *group, struct device *acpi_device)
+-{
+- iommu_create_device_direct_mappings(group, acpi_device);
+-}
+-EXPORT_SYMBOL_GPL(__acpi_device_create_direct_mappings);
+-
+ /**
+ * iommu_group_add_device - add a device to an iommu group
+ * @group: the group into which to add the device (reference should be held)
+@@ -923,9 +912,6 @@ void iommu_group_remove_device(struct device *dev)
+ struct iommu_group *group = dev->iommu_group;
+ struct group_device *tmp_device, *device = NULL;
+
+- if (!group)
+- return;
+-
+ dev_info(dev, "Removing from iommu group %d\n", group->id);
+
+ /* Pre-notify listeners that a device is being removed. */
+@@ -1084,6 +1070,39 @@ int iommu_group_unregister_notifier(struct iommu_group *group,
+ }
+ EXPORT_SYMBOL_GPL(iommu_group_unregister_notifier);
+
++static void iommu_dev_fault_timer_fn(struct timer_list *t)
++{
++ struct iommu_fault_param *fparam = from_timer(fparam, t, timer);
++ struct iommu_fault_event *evt;
++ struct iommu_fault_page_request *prm;
++
++ u64 now;
++
++ now = get_jiffies_64();
++
++ /* The goal is to ensure driver or guest page fault handler(via vfio)
++ * send page response on time. Otherwise, limited queue resources
++ * may be occupied by some irresponsive guests or drivers.
++ * When per device pending fault list is not empty, we periodically checks
++ * if any anticipated page response time has expired.
++ *
++ * TODO:
++ * We could do the following if response time expires:
++ * 1. send page response code FAILURE to all pending PRQ
++ * 2. inform device driver or vfio
++ * 3. drain in-flight page requests and responses for this device
++ * 4. clear pending fault list such that driver can unregister fault
++ * handler(otherwise blocked when pending faults are present).
++ */
++ list_for_each_entry(evt, &fparam->faults, list) {
++ prm = &evt->fault.prm;
++ if (time_after64(now, evt->expire))
++ pr_err("Page response time expired!, pasid %d gid %d exp %llu now %llu\n",
++ prm->pasid, prm->grpid, evt->expire, now);
++ }
++ mod_timer(t, now + prq_timeout);
++}
++
+ /**
+ * iommu_register_device_fault_handler() - Register a device fault handler
+ * @dev: the device
+@@ -1131,6 +1150,9 @@ int iommu_register_device_fault_handler(struct device *dev,
+ mutex_init(¶m->fault_param->lock);
+ INIT_LIST_HEAD(¶m->fault_param->faults);
+
++ if (prq_timeout)
++ timer_setup(¶m->fault_param->timer, iommu_dev_fault_timer_fn,
++ TIMER_DEFERRABLE);
+ done_unlock:
+ mutex_unlock(¶m->lock);
+
+@@ -1270,7 +1292,9 @@ int iommu_report_device_fault(struct device *dev, struct iommu_fault_event *evt)
+ struct dev_iommu *param = dev->iommu;
+ struct iommu_fault_event *evt_pending = NULL;
+ struct iommu_fault_param *fparam;
++ struct timer_list *tmr;
+ int ret = 0;
++ u64 exp;
+
+ if (!param || !evt || WARN_ON_ONCE(!iommu_fault_valid(&evt->fault)))
+ return -EINVAL;
+@@ -1291,7 +1315,17 @@ int iommu_report_device_fault(struct device *dev, struct iommu_fault_event *evt)
+ ret = -ENOMEM;
+ goto done_unlock;
+ }
++ /* Keep track of response expiration time */
++ exp = get_jiffies_64() + prq_timeout;
++ evt_pending->expire = exp;
+ mutex_lock(&fparam->lock);
++ if (list_empty(&fparam->faults)) {
++ /* First pending event, start timer */
++ tmr = &fparam->timer;
++ WARN_ON(timer_pending(tmr));
++ mod_timer(tmr, exp);
++ }
++
+ list_add_tail(&evt_pending->list, &fparam->faults);
+ mutex_unlock(&fparam->lock);
+ }
+@@ -1369,6 +1403,13 @@ int iommu_page_response(struct device *dev,
+ break;
+ }
+
++ /* stop response timer if no more pending request */
++ if (list_empty(¶m->fault_param->faults) &&
++ timer_pending(¶m->fault_param->timer)) {
++ pr_debug("no pending PRQ, stop timer\n");
++ del_timer(¶m->fault_param->timer);
++ }
++
+ done_unlock:
+ mutex_unlock(¶m->fault_param->lock);
+ return ret;
+@@ -2032,7 +2073,6 @@ static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
+ domain->type = type;
+ /* Assume all sizes by default; the driver may override this later */
+ domain->pgsize_bitmap = bus->iommu_ops->pgsize_bitmap;
+- mutex_init(&domain->switch_log_lock);
+
+ return domain;
+ }
+@@ -2476,8 +2516,8 @@ phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova)
+ }
+ EXPORT_SYMBOL_GPL(iommu_iova_to_phys);
+
+-size_t iommu_pgsize(struct iommu_domain *domain,
+- unsigned long addr_merge, size_t size)
++static size_t iommu_pgsize(struct iommu_domain *domain,
++ unsigned long addr_merge, size_t size)
+ {
+ unsigned int pgsize_idx;
+ size_t pgsize;
+@@ -2507,7 +2547,6 @@ size_t iommu_pgsize(struct iommu_domain *domain,
+
+ return pgsize;
+ }
+-EXPORT_SYMBOL_GPL(iommu_pgsize);
+
+ static int __iommu_map(struct iommu_domain *domain, unsigned long iova,
+ phys_addr_t paddr, size_t size, int prot, gfp_t gfp)
+@@ -2851,188 +2890,6 @@ int iommu_domain_set_attr(struct iommu_domain *domain,
+ }
+ EXPORT_SYMBOL_GPL(iommu_domain_set_attr);
+
+-bool iommu_support_dirty_log(struct iommu_domain *domain)
+-{
+- const struct iommu_ops *ops = domain->ops;
+-
+- return ops->support_dirty_log && ops->support_dirty_log(domain);
+-}
+-EXPORT_SYMBOL_GPL(iommu_support_dirty_log);
+-
+-int iommu_switch_dirty_log(struct iommu_domain *domain, bool enable,
+- unsigned long iova, size_t size, int prot)
+-{
+- const struct iommu_ops *ops = domain->ops;
+- unsigned long orig_iova = iova;
+- unsigned int min_pagesz;
+- size_t orig_size = size;
+- bool flush = false;
+- int ret = 0;
+-
+- if (unlikely(!ops->switch_dirty_log))
+- return -ENODEV;
+-
+- min_pagesz = 1 << __ffs(domain->pgsize_bitmap);
+- if (!IS_ALIGNED(iova | size, min_pagesz)) {
+- pr_err("unaligned: iova 0x%lx size 0x%zx min_pagesz 0x%x\n",
+- iova, size, min_pagesz);
+- return -EINVAL;
+- }
+-
+- mutex_lock(&domain->switch_log_lock);
+-
+- pr_debug("switch_dirty_log %s for: iova 0x%lx size 0x%zx\n",
+- enable ? "enable" : "disable", iova, size);
+-
+- while (size) {
+- size_t pgsize = iommu_pgsize(domain, iova, size);
+-
+- flush = true;
+- ret = ops->switch_dirty_log(domain, enable, iova, pgsize, prot);
+- if (ret)
+- break;
+-
+- pr_debug("switch_dirty_log handled: iova 0x%lx size 0x%zx\n",
+- iova, pgsize);
+-
+- iova += pgsize;
+- size -= pgsize;
+- }
+-
+- if (flush)
+- iommu_flush_iotlb_all(domain);
+-
+- if (!ret)
+- trace_switch_dirty_log(orig_iova, orig_size, enable);
+-
+- mutex_unlock(&domain->switch_log_lock);
+- return ret;
+-}
+-EXPORT_SYMBOL_GPL(iommu_switch_dirty_log);
+-
+-int iommu_sync_dirty_log(struct iommu_domain *domain, unsigned long iova,
+- size_t size, unsigned long *bitmap,
+- unsigned long base_iova, unsigned long bitmap_pgshift)
+-{
+- const struct iommu_ops *ops = domain->ops;
+- unsigned long orig_iova = iova;
+- unsigned int min_pagesz;
+- size_t orig_size = size;
+- int ret = 0;
+-
+- if (unlikely(!ops->sync_dirty_log))
+- return -ENODEV;
+-
+- min_pagesz = 1 << __ffs(domain->pgsize_bitmap);
+- if (!IS_ALIGNED(iova | size, min_pagesz)) {
+- pr_err("unaligned: iova 0x%lx size 0x%zx min_pagesz 0x%x\n",
+- iova, size, min_pagesz);
+- return -EINVAL;
+- }
+-
+- mutex_lock(&domain->switch_log_lock);
+-
+- pr_debug("sync_dirty_log for: iova 0x%lx size 0x%zx\n", iova, size);
+-
+- while (size) {
+- size_t pgsize = iommu_pgsize(domain, iova, size);
+-
+- ret = ops->sync_dirty_log(domain, iova, pgsize,
+- bitmap, base_iova, bitmap_pgshift);
+- if (ret)
+- break;
+-
+- pr_debug("sync_dirty_log handled: iova 0x%lx size 0x%zx\n",
+- iova, pgsize);
+-
+- iova += pgsize;
+- size -= pgsize;
+- }
+-
+- if (!ret)
+- trace_sync_dirty_log(orig_iova, orig_size);
+-
+- mutex_unlock(&domain->switch_log_lock);
+- return ret;
+-}
+-EXPORT_SYMBOL_GPL(iommu_sync_dirty_log);
+-
+-static int __iommu_clear_dirty_log(struct iommu_domain *domain,
+- unsigned long iova, size_t size,
+- unsigned long *bitmap,
+- unsigned long base_iova,
+- unsigned long bitmap_pgshift)
+-{
+- const struct iommu_ops *ops = domain->ops;
+- unsigned long orig_iova = iova;
+- size_t orig_size = size;
+- int ret = 0;
+-
+- if (unlikely(!ops->clear_dirty_log))
+- return -ENODEV;
+-
+- pr_debug("clear_dirty_log for: iova 0x%lx size 0x%zx\n", iova, size);
+-
+- while (size) {
+- size_t pgsize = iommu_pgsize(domain, iova, size);
+-
+- ret = ops->clear_dirty_log(domain, iova, pgsize, bitmap,
+- base_iova, bitmap_pgshift);
+- if (ret)
+- break;
+-
+- pr_debug("clear_dirty_log handled: iova 0x%lx size 0x%zx\n",
+- iova, pgsize);
+-
+- iova += pgsize;
+- size -= pgsize;
+- }
+-
+- if (!ret)
+- trace_clear_dirty_log(orig_iova, orig_size);
+-
+- return ret;
+-}
+-
+-int iommu_clear_dirty_log(struct iommu_domain *domain,
+- unsigned long iova, size_t size,
+- unsigned long *bitmap, unsigned long base_iova,
+- unsigned long bitmap_pgshift)
+-{
+- unsigned long riova, rsize;
+- unsigned int min_pagesz, rs, re, start, end;
+- bool flush = false;
+- int ret = 0;
+-
+- min_pagesz = 1 << __ffs(domain->pgsize_bitmap);
+- if (!IS_ALIGNED(iova | size, min_pagesz)) {
+- pr_err("unaligned: iova 0x%lx min_pagesz 0x%x\n",
+- iova, min_pagesz);
+- return -EINVAL;
+- }
+-
+- mutex_lock(&domain->switch_log_lock);
+-
+- start = (iova - base_iova) >> bitmap_pgshift;
+- end = start + (size >> bitmap_pgshift);
+- bitmap_for_each_set_region(bitmap, rs, re, start, end) {
+- flush = true;
+- riova = base_iova + ((unsigned long)rs << bitmap_pgshift);
+- rsize = (unsigned long)(re - rs) << bitmap_pgshift;
+- ret = __iommu_clear_dirty_log(domain, riova, rsize, bitmap,
+- base_iova, bitmap_pgshift);
+- if (ret)
+- break;
+- }
+-
+- if (flush)
+- iommu_flush_iotlb_all(domain);
+-
+- mutex_unlock(&domain->switch_log_lock);
+- return ret;
+-}
+-EXPORT_SYMBOL_GPL(iommu_clear_dirty_log);
+-
+ void iommu_get_resv_regions(struct device *dev, struct list_head *list)
+ {
+ const struct iommu_ops *ops = dev->bus->iommu_ops;
+@@ -3411,24 +3268,54 @@ u32 iommu_sva_get_pasid(struct iommu_sva *handle)
+ }
+ EXPORT_SYMBOL_GPL(iommu_sva_get_pasid);
+
+-int iommu_dev_set_config(struct device *dev, int type, void *data)
++/* Request that a device is direct mapped by the IOMMU */
++int iommu_request_dm_for_dev(struct device *dev)
+ {
+- const struct iommu_ops *ops = dev->bus->iommu_ops;
++ struct iommu_domain *dm_domain;
++ struct iommu_group *group;
++ int ret;
+
+- if (ops && ops->dev_set_config)
+- return ops->dev_set_config(dev, type, data);
++ /* Device must already be in a group before calling this function */
++ group = iommu_group_get_for_dev(dev);
++ if (IS_ERR(group))
++ return PTR_ERR(group);
+
+- return -ENODEV;
+-}
+-EXPORT_SYMBOL_GPL(iommu_dev_set_config);
++ mutex_lock(&group->mutex);
+
+-int iommu_dev_get_config(struct device *dev, int type, void *data)
+-{
+- const struct iommu_ops *ops = dev->bus->iommu_ops;
++ /* Check if the default domain is already direct mapped */
++ ret = 0;
++ if (group->default_domain &&
++ group->default_domain->type == IOMMU_DOMAIN_IDENTITY)
++ goto out;
+
+- if (ops && ops->dev_get_config)
+- return ops->dev_get_config(dev, type, data);
++ /* Don't change mappings of existing devices */
++ ret = -EBUSY;
++ if (iommu_group_device_count(group) != 1)
++ goto out;
+
+- return -ENODEV;
++ /* Allocate a direct mapped domain */
++ ret = -ENOMEM;
++ dm_domain = __iommu_domain_alloc(dev->bus, IOMMU_DOMAIN_IDENTITY);
++ if (!dm_domain)
++ goto out;
++
++ /* Attach the device to the domain */
++ ret = __iommu_attach_group(dm_domain, group);
++ if (ret) {
++ iommu_domain_free(dm_domain);
++ goto out;
++ }
++ /* Make the direct mapped domain the default for this group */
++ if (group->default_domain)
++ iommu_domain_free(group->default_domain);
++ group->default_domain = dm_domain;
++
++ pr_info("Using direct mapping for device %s\n", dev_name(dev));
++
++ ret = 0;
++out:
++ mutex_unlock(&group->mutex);
++ iommu_group_put(group);
++
++ return ret;
+ }
+-EXPORT_SYMBOL_GPL(iommu_dev_get_config);
+diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c
+index 1246e8f8bf08..30d969a4c5fd 100644
+--- a/drivers/iommu/iova.c
++++ b/drivers/iommu/iova.c
+@@ -64,9 +64,9 @@ static void free_iova_flush_queue(struct iova_domain *iovad)
+ if (!has_iova_flush_queue(iovad))
+ return;
+
+- del_timer_sync(&iovad->fq_timer);
++ if (timer_pending(&iovad->fq_timer))
++ del_timer(&iovad->fq_timer);
+
+- flush_work(&iovad->free_iova_work);
+ fq_destroy_all_entries(iovad);
+
+ free_percpu(iovad->fq);
+@@ -76,24 +76,6 @@ static void free_iova_flush_queue(struct iova_domain *iovad)
+ iovad->entry_dtor = NULL;
+ }
+
+-static void fq_ring_free(struct iova_domain *iovad, struct iova_fq *fq);
+-static void free_iova_work_func(struct work_struct *work)
+-{
+- struct iova_domain *iovad;
+- int cpu;
+-
+- iovad = container_of(work, struct iova_domain, free_iova_work);
+- for_each_possible_cpu(cpu) {
+- unsigned long flags;
+- struct iova_fq *fq;
+-
+- fq = per_cpu_ptr(iovad->fq, cpu);
+- spin_lock_irqsave(&fq->lock, flags);
+- fq_ring_free(iovad, fq);
+- spin_unlock_irqrestore(&fq->lock, flags);
+- }
+-}
+-
+ int init_iova_flush_queue(struct iova_domain *iovad,
+ iova_flush_cb flush_cb, iova_entry_dtor entry_dtor)
+ {
+@@ -124,7 +106,6 @@ int init_iova_flush_queue(struct iova_domain *iovad,
+
+ iovad->fq = queue;
+
+- INIT_WORK(&iovad->free_iova_work, free_iova_work_func);
+ timer_setup(&iovad->fq_timer, fq_flush_timeout, 0);
+ atomic_set(&iovad->fq_timer_on, 0);
+
+@@ -158,11 +139,10 @@ __cached_rbnode_delete_update(struct iova_domain *iovad, struct iova *free)
+ cached_iova = rb_entry(iovad->cached32_node, struct iova, node);
+ if (free == cached_iova ||
+ (free->pfn_hi < iovad->dma_32bit_pfn &&
+- free->pfn_lo >= cached_iova->pfn_lo))
++ free->pfn_lo >= cached_iova->pfn_lo)) {
+ iovad->cached32_node = rb_next(&free->node);
+-
+- if (free->pfn_lo < iovad->dma_32bit_pfn)
+ iovad->max32_alloc_size = iovad->dma_32bit_pfn;
++ }
+
+ cached_iova = rb_entry(iovad->cached_node, struct iova, node);
+ if (free->pfn_lo >= cached_iova->pfn_lo)
+@@ -550,11 +530,20 @@ static void fq_destroy_all_entries(struct iova_domain *iovad)
+ static void fq_flush_timeout(struct timer_list *t)
+ {
+ struct iova_domain *iovad = from_timer(iovad, t, fq_timer);
++ int cpu;
+
+ atomic_set(&iovad->fq_timer_on, 0);
+ iova_domain_flush(iovad);
+
+- schedule_work(&iovad->free_iova_work);
++ for_each_possible_cpu(cpu) {
++ unsigned long flags;
++ struct iova_fq *fq;
++
++ fq = per_cpu_ptr(iovad->fq, cpu);
++ spin_lock_irqsave(&fq->lock, flags);
++ fq_ring_free(iovad, fq);
++ spin_unlock_irqrestore(&fq->lock, flags);
++ }
+ }
+
+ void queue_iova(struct iova_domain *iovad,
+diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
+index d9068e8f2db4..d71f10257f15 100644
+--- a/drivers/iommu/ipmmu-vmsa.c
++++ b/drivers/iommu/ipmmu-vmsa.c
+@@ -1012,9 +1012,7 @@ static int ipmmu_probe(struct platform_device *pdev)
+ bitmap_zero(mmu->ctx, IPMMU_CTX_MAX);
+ mmu->features = of_device_get_match_data(&pdev->dev);
+ memset(mmu->utlb_ctx, IPMMU_CTX_INVALID, mmu->features->num_utlbs);
+- ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40));
+- if (ret)
+- return ret;
++ dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40));
+
+ /* Map I/O memory and request IRQ. */
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+diff --git a/drivers/iommu/msm_iommu.c b/drivers/iommu/msm_iommu.c
+index 08947fdd4cb4..040e85f70861 100644
+--- a/drivers/iommu/msm_iommu.c
++++ b/drivers/iommu/msm_iommu.c
+@@ -609,19 +609,16 @@ static void insert_iommu_master(struct device *dev,
+ static int qcom_iommu_of_xlate(struct device *dev,
+ struct of_phandle_args *spec)
+ {
+- struct msm_iommu_dev *iommu = NULL, *iter;
++ struct msm_iommu_dev *iommu;
+ unsigned long flags;
+ int ret = 0;
+
+ spin_lock_irqsave(&msm_iommu_lock, flags);
+- list_for_each_entry(iter, &qcom_iommu_devices, dev_node) {
+- if (iter->dev->of_node == spec->np) {
+- iommu = iter;
++ list_for_each_entry(iommu, &qcom_iommu_devices, dev_node)
++ if (iommu->dev->of_node == spec->np)
+ break;
+- }
+- }
+
+- if (!iommu) {
++ if (!iommu || iommu->dev->of_node != spec->np) {
+ ret = -ENODEV;
+ goto fail;
+ }
+diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c
+index dd0ff2d3cfe4..bfe6ec329f8d 100644
+--- a/drivers/iommu/mtk_iommu.c
++++ b/drivers/iommu/mtk_iommu.c
+@@ -767,7 +767,8 @@ static int mtk_iommu_remove(struct platform_device *pdev)
+ iommu_device_sysfs_remove(&data->iommu);
+ iommu_device_unregister(&data->iommu);
+
+- list_del(&data->list);
++ if (iommu_present(&platform_bus_type))
++ bus_set_iommu(&platform_bus_type, NULL);
+
+ clk_disable_unprepare(data->bclk);
+ devm_free_irq(&pdev->dev, data->irq, data);
+diff --git a/drivers/iommu/mtk_iommu_v1.c b/drivers/iommu/mtk_iommu_v1.c
+index 2abbdd71d8d9..82ddfe9170d4 100644
+--- a/drivers/iommu/mtk_iommu_v1.c
++++ b/drivers/iommu/mtk_iommu_v1.c
+@@ -618,34 +618,18 @@ static int mtk_iommu_probe(struct platform_device *pdev)
+ ret = iommu_device_sysfs_add(&data->iommu, &pdev->dev, NULL,
+ dev_name(&pdev->dev));
+ if (ret)
+- goto out_clk_unprepare;
++ return ret;
+
+ iommu_device_set_ops(&data->iommu, &mtk_iommu_ops);
+
+ ret = iommu_device_register(&data->iommu);
+ if (ret)
+- goto out_sysfs_remove;
++ return ret;
+
+- if (!iommu_present(&platform_bus_type)) {
+- ret = bus_set_iommu(&platform_bus_type, &mtk_iommu_ops);
+- if (ret)
+- goto out_dev_unreg;
+- }
++ if (!iommu_present(&platform_bus_type))
++ bus_set_iommu(&platform_bus_type, &mtk_iommu_ops);
+
+- ret = component_master_add_with_match(dev, &mtk_iommu_com_ops, match);
+- if (ret)
+- goto out_bus_set_null;
+- return ret;
+-
+-out_bus_set_null:
+- bus_set_iommu(&platform_bus_type, NULL);
+-out_dev_unreg:
+- iommu_device_unregister(&data->iommu);
+-out_sysfs_remove:
+- iommu_device_sysfs_remove(&data->iommu);
+-out_clk_unprepare:
+- clk_disable_unprepare(data->bclk);
+- return ret;
++ return component_master_add_with_match(dev, &mtk_iommu_com_ops, match);
+ }
+
+ static int mtk_iommu_remove(struct platform_device *pdev)
+diff --git a/drivers/iommu/omap-iommu-debug.c b/drivers/iommu/omap-iommu-debug.c
+index 259f65291d90..a99afb5d9011 100644
+--- a/drivers/iommu/omap-iommu-debug.c
++++ b/drivers/iommu/omap-iommu-debug.c
+@@ -32,12 +32,12 @@ static inline bool is_omap_iommu_detached(struct omap_iommu *obj)
+ ssize_t bytes; \
+ const char *str = "%20s: %08x\n"; \
+ const int maxcol = 32; \
+- if (len < maxcol) \
+- goto out; \
+- bytes = scnprintf(p, maxcol, str, __stringify(name), \
++ bytes = snprintf(p, maxcol, str, __stringify(name), \
+ iommu_read_reg(obj, MMU_##name)); \
+ p += bytes; \
+ len -= bytes; \
++ if (len < maxcol) \
++ goto out; \
+ } while (0)
+
+ static ssize_t
+diff --git a/drivers/iommu/omap-iommu.c b/drivers/iommu/omap-iommu.c
+index ff2c692c0db4..71f29c0927fc 100644
+--- a/drivers/iommu/omap-iommu.c
++++ b/drivers/iommu/omap-iommu.c
+@@ -1665,7 +1665,7 @@ static struct iommu_device *omap_iommu_probe_device(struct device *dev)
+ num_iommus = of_property_count_elems_of_size(dev->of_node, "iommus",
+ sizeof(phandle));
+ if (num_iommus < 0)
+- return ERR_PTR(-ENODEV);
++ return 0;
+
+ arch_data = kcalloc(num_iommus + 1, sizeof(*arch_data), GFP_KERNEL);
+ if (!arch_data)
+diff --git a/drivers/iommu/sun50i-iommu.c b/drivers/iommu/sun50i-iommu.c
+index 65aa30d55d3a..ea6db1341916 100644
+--- a/drivers/iommu/sun50i-iommu.c
++++ b/drivers/iommu/sun50i-iommu.c
+@@ -28,7 +28,6 @@
+ #include
+
+ #define IOMMU_RESET_REG 0x010
+-#define IOMMU_RESET_RELEASE_ALL 0xffffffff
+ #define IOMMU_ENABLE_REG 0x020
+ #define IOMMU_ENABLE_ENABLE BIT(0)
+
+@@ -272,7 +271,7 @@ static u32 sun50i_mk_pte(phys_addr_t page, int prot)
+ enum sun50i_iommu_aci aci;
+ u32 flags = 0;
+
+- if ((prot & (IOMMU_READ | IOMMU_WRITE)) == (IOMMU_READ | IOMMU_WRITE))
++ if (prot & (IOMMU_READ | IOMMU_WRITE))
+ aci = SUN50I_IOMMU_ACI_RD_WR;
+ else if (prot & IOMMU_READ)
+ aci = SUN50I_IOMMU_ACI_RD;
+@@ -513,7 +512,7 @@ static u32 *sun50i_dte_get_page_table(struct sun50i_iommu_domain *sun50i_domain,
+ sun50i_iommu_free_page_table(iommu, drop_pt);
+ }
+
+- sun50i_table_flush(sun50i_domain, page_table, NUM_PT_ENTRIES);
++ sun50i_table_flush(sun50i_domain, page_table, PT_SIZE);
+ sun50i_table_flush(sun50i_domain, dte_addr, 1);
+
+ return page_table;
+@@ -603,6 +602,7 @@ static struct iommu_domain *sun50i_iommu_domain_alloc(unsigned type)
+ struct sun50i_iommu_domain *sun50i_domain;
+
+ if (type != IOMMU_DOMAIN_DMA &&
++ type != IOMMU_DOMAIN_IDENTITY &&
+ type != IOMMU_DOMAIN_UNMANAGED)
+ return NULL;
+
+@@ -880,8 +880,8 @@ static phys_addr_t sun50i_iommu_handle_perm_irq(struct sun50i_iommu *iommu)
+
+ static irqreturn_t sun50i_iommu_irq(int irq, void *dev_id)
+ {
+- u32 status, l1_status, l2_status, resets;
+ struct sun50i_iommu *iommu = dev_id;
++ u32 status;
+
+ spin_lock(&iommu->iommu_lock);
+
+@@ -891,9 +891,6 @@ static irqreturn_t sun50i_iommu_irq(int irq, void *dev_id)
+ return IRQ_NONE;
+ }
+
+- l1_status = iommu_read(iommu, IOMMU_L1PG_INT_REG);
+- l2_status = iommu_read(iommu, IOMMU_L2PG_INT_REG);
+-
+ if (status & IOMMU_INT_INVALID_L2PG)
+ sun50i_iommu_handle_pt_irq(iommu,
+ IOMMU_INT_ERR_ADDR_L2_REG,
+@@ -907,9 +904,8 @@ static irqreturn_t sun50i_iommu_irq(int irq, void *dev_id)
+
+ iommu_write(iommu, IOMMU_INT_CLR_REG, status);
+
+- resets = (status | l1_status | l2_status) & IOMMU_INT_MASTER_MASK;
+- iommu_write(iommu, IOMMU_RESET_REG, ~resets);
+- iommu_write(iommu, IOMMU_RESET_REG, IOMMU_RESET_RELEASE_ALL);
++ iommu_write(iommu, IOMMU_RESET_REG, ~status);
++ iommu_write(iommu, IOMMU_RESET_REG, status);
+
+ spin_unlock(&iommu->iommu_lock);
+
+diff --git a/drivers/iommu/sw64/Kconfig b/drivers/iommu/sw64/Kconfig
+deleted file mode 100644
+index a313c6e2d11b..000000000000
+--- a/drivers/iommu/sw64/Kconfig
++++ /dev/null
+@@ -1,9 +0,0 @@
+-# SPDX-License-Identifier: GPL-2.0-only
+-# SW64 IOMMU SUPPORT
+-config SUNWAY_IOMMU
+- bool "Sunway IOMMU Support"
+- select IOMMU_API
+- select IOMMU_IOVA
+- depends on SW64 && PCI
+- help
+- Support for IOMMU on SW64 platform.
+diff --git a/drivers/iommu/sw64/Makefile b/drivers/iommu/sw64/Makefile
+deleted file mode 100644
+index e23dbd40a74d..000000000000
+--- a/drivers/iommu/sw64/Makefile
++++ /dev/null
+@@ -1,2 +0,0 @@
+-# SPDX-License-Identifier: GPL-2.0-only
+-obj-$(CONFIG_SUNWAY_IOMMU) += sunway_iommu.o
+diff --git a/drivers/iommu/sw64/sunway_iommu.c b/drivers/iommu/sw64/sunway_iommu.c
+deleted file mode 100644
+index 86920f88faac..000000000000
+--- a/drivers/iommu/sw64/sunway_iommu.c
++++ /dev/null
+@@ -1,1693 +0,0 @@
+-// SPDX-License-Identifier: GPL-2.0
+-/*
+- * iommu.c: Generic sw64 IOMMU support
+- *
+- * This is designed and tested for 3231. If there are no changes in hardware
+- * in later chips, then it should work just as well.
+- *
+- */
+-
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include
+-#include