<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Segoe UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
/* Style Definitions */
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        mso-ligatures:none;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<p style="font-family:Arial;font-size:10pt;color:#0000FF;margin:5pt;font-style:normal;font-weight:normal;text-decoration:none;" align="Left">
[AMD Official Use Only - General]<br>
</p>
<br>
<div>
<div class="WordSection1">
<p class="MsoPlainText">Hi Alex,<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Please see inline comments.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><span style="color:#385723;mso-style-textfill-fill-color:#385723;mso-style-textfill-fill-alpha:100.0%">RE: You should replace 162 with whatever the src id you need for your IP is.  162 was the src id for ACP.  I think it's something
 else for ISP.<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:#385723;mso-style-textfill-fill-color:#385723;mso-style-textfill-fill-alpha:100.0%">Also, if you need both the client id and the src id, you should update<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:#385723;mso-style-textfill-fill-color:#385723;mso-style-textfill-fill-alpha:100.0%">amdgpu_irq_create_mapping() to take into account both ids.<o:p></o:p></span></p>
<p class="MsoPlainText">>> removed adding the IORESOURCE_IRQ in this patch and is taken care of it in the separate patch(i.e. patch 4/4), which is yet to submitted to amd-gfx group.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Thanks,<o:p></o:p></p>
<p class="MsoPlainText">Pratap<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">-----Original Message-----<br>
From: Alex Deucher <alexdeucher@gmail.com> <br>
Sent: Thursday, May 9, 2024 11:35 AM<br>
To: Nirujogi, Pratap <Pratap.Nirujogi@amd.com><br>
Cc: amd-gfx@lists.freedesktop.org; Deucher, Alexander <Alexander.Deucher@amd.com>; Chan, Benjamin (Koon Pan) <Benjamin.Chan@amd.com>; Li, King <King.Li@amd.com>; Du, Bin <Bin.Du@amd.com><br>
Subject: Re: [PATCH 2/3] drm/amd/amdgpu: Add ISP driver support</p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">On Wed, May 8, 2024 at 11:17 AM Pratap Nirujogi <<a href="mailto:pratap.nirujogi@amd.com"><span style="color:windowtext;text-decoration:none">pratap.nirujogi@amd.com</span></a>> wrote:<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">> Add the isp driver in amdgpu to support ISP device on the APUs that
<o:p></o:p></p>
<p class="MsoPlainText">> supports ISP IP block. ISP hw block is used for camera front-end, pre
<o:p></o:p></p>
<p class="MsoPlainText">> and post processing operations.<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">> Signed-off-by: Pratap Nirujogi <<a href="mailto:pratap.nirujogi@amd.com"><span style="color:windowtext;text-decoration:none">pratap.nirujogi@amd.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> ---<o:p></o:p></p>
<p class="MsoPlainText">>  drivers/gpu/drm/amd/amdgpu/Makefile       |   3 +<o:p></o:p></p>
<p class="MsoPlainText">>  drivers/gpu/drm/amd/amdgpu/amdgpu.h       |   4 +<o:p></o:p></p>
<p class="MsoPlainText">>  drivers/gpu/drm/amd/amdgpu/amdgpu_isp.c   | 298 ++++++++++++++++++++++<o:p></o:p></p>
<p class="MsoPlainText">>  drivers/gpu/drm/amd/amdgpu/amdgpu_isp.h   |  54 ++++<o:p></o:p></p>
<p class="MsoPlainText">>  drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c   |   3 +<o:p></o:p></p>
<p class="MsoPlainText">>  drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c |   5 +<o:p></o:p></p>
<p class="MsoPlainText">>  drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h |   1 +<o:p></o:p></p>
<p class="MsoPlainText">>  7 files changed, 368 insertions(+)<o:p></o:p></p>
<p class="MsoPlainText">>  create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_isp.c<o:p></o:p></p>
<p class="MsoPlainText">>  create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_isp.h<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">> diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile <o:p></o:p></p>
<p class="MsoPlainText">> b/drivers/gpu/drm/amd/amdgpu/Makefile<o:p></o:p></p>
<p class="MsoPlainText">> index de7b76327f5b..12ba76025cb7 100644<o:p></o:p></p>
<p class="MsoPlainText">> --- a/drivers/gpu/drm/amd/amdgpu/Makefile<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/drivers/gpu/drm/amd/amdgpu/Makefile<o:p></o:p></p>
<p class="MsoPlainText">> @@ -324,4 +324,7 @@ amdgpu-y += $(AMD_DISPLAY_FILES)<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>  endif<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">> +# add isp block<o:p></o:p></p>
<p class="MsoPlainText">> +amdgpu-y += amdgpu_isp.o<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">>  obj-$(CONFIG_DRM_AMDGPU)+= amdgpu.o<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h <o:p></o:p></p>
<p class="MsoPlainText">> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h<o:p></o:p></p>
<p class="MsoPlainText">> index eb60d28a3a13..6d7f9ef53269 100644<o:p></o:p></p>
<p class="MsoPlainText">> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h<o:p></o:p></p>
<p class="MsoPlainText">> @@ -112,6 +112,7 @@<o:p></o:p></p>
<p class="MsoPlainText">>  #include "amdgpu_xcp.h"<o:p></o:p></p>
<p class="MsoPlainText">>  #include "amdgpu_seq64.h"<o:p></o:p></p>
<p class="MsoPlainText">>  #include "amdgpu_reg_state.h"<o:p></o:p></p>
<p class="MsoPlainText">> +#include "amdgpu_isp.h"<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>  #define MAX_GPU_INSTANCE               64<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">> @@ -1045,6 +1046,9 @@ struct amdgpu_device {<o:p></o:p></p>
<p class="MsoPlainText">>         /* display related functionality */<o:p></o:p></p>
<p class="MsoPlainText">>         struct amdgpu_display_manager dm;<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">> +       /* isp */<o:p></o:p></p>
<p class="MsoPlainText">> +       struct amdgpu_isp               isp;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">>         /* mes */<o:p></o:p></p>
<p class="MsoPlainText">>         bool                            enable_mes;<o:p></o:p></p>
<p class="MsoPlainText">>         bool                            enable_mes_kiq;<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_isp.c <o:p>
</o:p></p>
<p class="MsoPlainText">> b/drivers/gpu/drm/amd/amdgpu/amdgpu_isp.c<o:p></o:p></p>
<p class="MsoPlainText">> new file mode 100644<o:p></o:p></p>
<p class="MsoPlainText">> index 000000000000..dcc01a339a43<o:p></o:p></p>
<p class="MsoPlainText">> --- /dev/null<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_isp.c<o:p></o:p></p>
<p class="MsoPlainText">> @@ -0,0 +1,298 @@<o:p></o:p></p>
<p class="MsoPlainText">> +/* SPDX-License-Identifier: MIT */<o:p></o:p></p>
<p class="MsoPlainText">> +/*<o:p></o:p></p>
<p class="MsoPlainText">> + * Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<o:p></o:p></p>
<p class="MsoPlainText">> + * All Rights Reserved.<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + * Permission is hereby granted, free of charge, to any person
<o:p></o:p></p>
<p class="MsoPlainText">> +obtaining a<o:p></o:p></p>
<p class="MsoPlainText">> + * copy of this software and associated documentation files (the<o:p></o:p></p>
<p class="MsoPlainText">> + * "Software"), to deal in the Software without restriction,
<o:p></o:p></p>
<p class="MsoPlainText">> +including<o:p></o:p></p>
<p class="MsoPlainText">> + * without limitation the rights to use, copy, modify, merge,
<o:p></o:p></p>
<p class="MsoPlainText">> +publish,<o:p></o:p></p>
<p class="MsoPlainText">> + * distribute, sub license, and/or sell copies of the Software, and
<o:p></o:p></p>
<p class="MsoPlainText">> +to<o:p></o:p></p>
<p class="MsoPlainText">> + * permit persons to whom the Software is furnished to do so, subject
<o:p></o:p></p>
<p class="MsoPlainText">> +to<o:p></o:p></p>
<p class="MsoPlainText">> + * the following conditions:<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
<o:p></o:p></p>
<p class="MsoPlainText">> +EXPRESS OR<o:p></o:p></p>
<p class="MsoPlainText">> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
<o:p></o:p></p>
<p class="MsoPlainText">> +MERCHANTABILITY,<o:p></o:p></p>
<p class="MsoPlainText">> + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT
<o:p></o:p></p>
<p class="MsoPlainText">> +SHALL<o:p></o:p></p>
<p class="MsoPlainText">> + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR
<o:p></o:p></p>
<p class="MsoPlainText">> +ANY CLAIM,<o:p></o:p></p>
<p class="MsoPlainText">> + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
<o:p></o:p></p>
<p class="MsoPlainText">> +OR<o:p></o:p></p>
<p class="MsoPlainText">> + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
<o:p></o:p></p>
<p class="MsoPlainText">> +OR THE<o:p></o:p></p>
<p class="MsoPlainText">> + * USE OR OTHER DEALINGS IN THE SOFTWARE.<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + * The above copyright notice and this permission notice (including
<o:p></o:p></p>
<p class="MsoPlainText">> +the<o:p></o:p></p>
<p class="MsoPlainText">> + * next paragraph) shall be included in all copies or substantial
<o:p></o:p></p>
<p class="MsoPlainText">> +portions<o:p></o:p></p>
<p class="MsoPlainText">> + * of the Software.<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + */<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +#include <linux/irqdomain.h><o:p></o:p></p>
<p class="MsoPlainText">> +#include <linux/pm_domain.h><o:p></o:p></p>
<p class="MsoPlainText">> +#include <linux/platform_device.h><o:p></o:p></p>
<p class="MsoPlainText">> +#include <sound/designware_i2s.h><o:p></o:p></p>
<p class="MsoPlainText">> +#include <sound/pcm.h><o:p></o:p></p>
<p class="MsoPlainText">> +#include <linux/acpi.h><o:p></o:p></p>
<p class="MsoPlainText">> +#include <linux/firmware.h><o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +#include "amdgpu_smu.h"<o:p></o:p></p>
<p class="MsoPlainText">> +#include "atom.h"<o:p></o:p></p>
<p class="MsoPlainText">> +#include "amdgpu_isp.h"<o:p></o:p></p>
<p class="MsoPlainText">> +#include "smu_internal.h"<o:p></o:p></p>
<p class="MsoPlainText">> +#include "smu_v11_5_ppsmc.h"<o:p></o:p></p>
<p class="MsoPlainText">> +#include "smu_v11_5_pmfw.h"<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +#define mmDAGB0_WRCLI5_V4_1    0x6811C<o:p></o:p></p>
<p class="MsoPlainText">> +#define mmDAGB0_WRCLI9_V4_1    0x6812C<o:p></o:p></p>
<p class="MsoPlainText">> +#define mmDAGB0_WRCLI10_V4_1   0x68130<o:p></o:p></p>
<p class="MsoPlainText">> +#define mmDAGB0_WRCLI14_V4_1   0x68140<o:p></o:p></p>
<p class="MsoPlainText">> +#define mmDAGB0_WRCLI19_V4_1   0x68154<o:p></o:p></p>
<p class="MsoPlainText">> +#define mmDAGB0_WRCLI20_V4_1   0x68158<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_sw_init(void *handle)<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +       struct amdgpu_device *adev = (struct amdgpu_device *)handle;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       pr_info("%s called adev %p\n", __func__, adev);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.parent = adev->dev;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.cgs_device = amdgpu_cgs_create_device(adev);<o:p></o:p></p>
<p class="MsoPlainText">> +       if (!adev->isp.cgs_device)<o:p></o:p></p>
<p class="MsoPlainText">> +               return -EINVAL;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       return 0;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_sw_fini(void *handle)<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +       struct amdgpu_device *adev = (struct amdgpu_device *)handle;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       pr_info("%s called adev %p\n", __func__, adev);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       if (adev->isp.cgs_device)<o:p></o:p></p>
<p class="MsoPlainText">> +               amdgpu_cgs_destroy_device(adev->isp.cgs_device);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       return 0;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +/**<o:p></o:p></p>
<p class="MsoPlainText">> + * isp_hw_init - start and test isp block<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + * @adev: amdgpu_device pointer<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + */<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_hw_init(void *handle)<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +       int r;<o:p></o:p></p>
<p class="MsoPlainText">> +       u64 isp_base;<o:p></o:p></p>
<p class="MsoPlainText">> +       struct amdgpu_device *adev = (struct amdgpu_device *)handle;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       const struct amdgpu_ip_block *ip_block =<o:p></o:p></p>
<p class="MsoPlainText">> +               amdgpu_device_ip_get_ip_block(adev, <o:p>
</o:p></p>
<p class="MsoPlainText">> + AMD_IP_BLOCK_TYPE_ISP);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       if (!ip_block)<o:p></o:p></p>
<p class="MsoPlainText">> +               return -EINVAL;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       if (adev->rmmio_size == 0 || adev->rmmio_size < 0x5289)<o:p></o:p></p>
<p class="MsoPlainText">> +               return -EINVAL;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       isp_base = adev->rmmio_base;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_cell = kcalloc(1, sizeof(struct mfd_cell), GFP_KERNEL);<o:p></o:p></p>
<p class="MsoPlainText">> +       if (!adev->isp.isp_cell) {<o:p></o:p></p>
<p class="MsoPlainText">> +               r = -ENOMEM;<o:p></o:p></p>
<p class="MsoPlainText">> +               DRM_ERROR("%s: isp mfd cell alloc failed\n", __func__);<o:p></o:p></p>
<p class="MsoPlainText">> +               goto failure;<o:p></o:p></p>
<p class="MsoPlainText">> +       }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_res = kcalloc(2, sizeof(struct resource), GFP_KERNEL);<o:p></o:p></p>
<p class="MsoPlainText">> +       if (!adev->isp.isp_res) {<o:p></o:p></p>
<p class="MsoPlainText">> +               r = -ENOMEM;<o:p></o:p></p>
<p class="MsoPlainText">> +               DRM_ERROR("%s: isp mfd res alloc failed\n", __func__);<o:p></o:p></p>
<p class="MsoPlainText">> +               goto failure;<o:p></o:p></p>
<p class="MsoPlainText">> +       }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_pdata = kzalloc(sizeof(*adev->isp.isp_pdata), GFP_KERNEL);<o:p></o:p></p>
<p class="MsoPlainText">> +       if (!adev->isp.isp_pdata) {<o:p></o:p></p>
<p class="MsoPlainText">> +               r = -ENOMEM;<o:p></o:p></p>
<p class="MsoPlainText">> +               DRM_ERROR("%s: isp platform data alloc failed\n", __func__);<o:p></o:p></p>
<p class="MsoPlainText">> +               goto failure;<o:p></o:p></p>
<p class="MsoPlainText">> +       }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       // initialize isp platform data<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_pdata->adev = (void *)adev;<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_pdata->asic_type = adev->asic_type;<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_pdata->base_rmmio_size = adev->rmmio_size;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_res[0].name = "isp41_reg";<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_res[0].flags = IORESOURCE_MEM;<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_res[0].start = isp_base;<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_res[0].end = isp_base + ISP_REGS_OFFSET_END;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_res[1].name = "isp41_irq";<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_res[1].flags = IORESOURCE_IRQ;<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_res[1].start = amdgpu_irq_create_mapping(adev,
<o:p></o:p></p>
<p class="MsoPlainText">> + 162);<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">You should replace 162 with whatever the src id you need for your IP is.  162 was the src id for ACP.  I think it's something else for ISP.<o:p></o:p></p>
<p class="MsoPlainText">Also, if you need both the client id and the src id, you should update<o:p></o:p></p>
<p class="MsoPlainText">amdgpu_irq_create_mapping() to take into account both ids.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Alex<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_res[1].end = adev->isp.isp_res[1].start;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_cell[0].name = "amd_isp41_capture";<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_cell[0].num_resources = 2;<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_cell[0].resources = &adev->isp.isp_res[0];<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_cell[0].platform_data = adev->isp.isp_pdata;<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->isp.isp_cell[0].pdata_size = sizeof(struct
<o:p></o:p></p>
<p class="MsoPlainText">> + isp_platform_data);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       r = mfd_add_hotplug_devices(adev->isp.parent, adev->isp.isp_cell, 1);<o:p></o:p></p>
<p class="MsoPlainText">> +       if (r) {<o:p></o:p></p>
<p class="MsoPlainText">> +               DRM_ERROR("%s: add mfd hotplug device failed\n", __func__);<o:p></o:p></p>
<p class="MsoPlainText">> +               goto failure;<o:p></o:p></p>
<p class="MsoPlainText">> +       }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       // Temporary WA added to disable MMHUB TLSi until the GART initialization<o:p></o:p></p>
<p class="MsoPlainText">> +       // is ready to support MMHUB TLSi and SAW for ISP HW to access GART memory<o:p></o:p></p>
<p class="MsoPlainText">> +       // using the TLSi path<o:p></o:p></p>
<p class="MsoPlainText">> +       cgs_write_register(adev->isp.cgs_device, mmDAGB0_WRCLI5_V4_1 >> 2, 0xFE5FEAA8);<o:p></o:p></p>
<p class="MsoPlainText">> +       cgs_write_register(adev->isp.cgs_device, mmDAGB0_WRCLI9_V4_1 >> 2, 0xFE5FEAA8);<o:p></o:p></p>
<p class="MsoPlainText">> +       cgs_write_register(adev->isp.cgs_device, mmDAGB0_WRCLI10_V4_1 >> 2, 0xFE5FEAA8);<o:p></o:p></p>
<p class="MsoPlainText">> +       cgs_write_register(adev->isp.cgs_device, mmDAGB0_WRCLI14_V4_1 >> 2, 0xFE5FEAA8);<o:p></o:p></p>
<p class="MsoPlainText">> +       cgs_write_register(adev->isp.cgs_device, mmDAGB0_WRCLI19_V4_1 >> 2, 0xFE5FEAA8);<o:p></o:p></p>
<p class="MsoPlainText">> +       cgs_write_register(adev->isp.cgs_device, mmDAGB0_WRCLI20_V4_1
<o:p></o:p></p>
<p class="MsoPlainText">> + >> 2, 0xFE5FEAA8);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       return 0;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +failure:<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       kfree(adev->isp.isp_pdata);<o:p></o:p></p>
<p class="MsoPlainText">> +       kfree(adev->isp.isp_res);<o:p></o:p></p>
<p class="MsoPlainText">> +       kfree(adev->isp.isp_cell);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       return r;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +/**<o:p></o:p></p>
<p class="MsoPlainText">> + * isp_hw_fini - stop the hardware block<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + * @adev: amdgpu_device pointer<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + */<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_hw_fini(void *handle)<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +       struct amdgpu_device *adev = (struct amdgpu_device *)handle;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       // remove isp mfd device<o:p></o:p></p>
<p class="MsoPlainText">> +       mfd_remove_devices(adev->isp.parent);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       kfree(adev->isp.isp_res);<o:p></o:p></p>
<p class="MsoPlainText">> +       kfree(adev->isp.isp_cell);<o:p></o:p></p>
<p class="MsoPlainText">> +       kfree(adev->isp.isp_pdata);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       return 0;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_suspend(void *handle)<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +       return 0;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_resume(void *handle)<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +       return 0;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_load_fw_by_psp(struct amdgpu_device *adev) {<o:p></o:p></p>
<p class="MsoPlainText">> +       const struct common_firmware_header *hdr;<o:p></o:p></p>
<p class="MsoPlainText">> +       char ucode_prefix[30];<o:p></o:p></p>
<p class="MsoPlainText">> +       char fw_name[40];<o:p></o:p></p>
<p class="MsoPlainText">> +       int r = 0;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       // get isp fw binary name and path<o:p></o:p></p>
<p class="MsoPlainText">> +       amdgpu_ucode_ip_version_decode(adev, ISP_HWIP, ucode_prefix,<o:p></o:p></p>
<p class="MsoPlainText">> +                                      sizeof(ucode_prefix));<o:p></o:p></p>
<p class="MsoPlainText">> +       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin",
<o:p></o:p></p>
<p class="MsoPlainText">> + ucode_prefix);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       // read isp fw<o:p></o:p></p>
<p class="MsoPlainText">> +       r = amdgpu_ucode_request(adev, &adev->isp.fw, fw_name);<o:p></o:p></p>
<p class="MsoPlainText">> +       if (r) {<o:p></o:p></p>
<p class="MsoPlainText">> +               DRM_ERROR("%s: failed to read isp fw %s\n", __func__, fw_name);<o:p></o:p></p>
<p class="MsoPlainText">> +               amdgpu_ucode_release(&adev->isp.fw);<o:p></o:p></p>
<p class="MsoPlainText">> +               return r;<o:p></o:p></p>
<p class="MsoPlainText">> +       }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       hdr = (const struct common_firmware_header <o:p>
</o:p></p>
<p class="MsoPlainText">> + *)adev->isp.fw->data;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->firmware.ucode[AMDGPU_UCODE_ID_ISP].ucode_id =<o:p></o:p></p>
<p class="MsoPlainText">> +               AMDGPU_UCODE_ID_ISP;<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->firmware.ucode[AMDGPU_UCODE_ID_ISP].fw = adev->isp.fw;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       adev->firmware.fw_size +=<o:p></o:p></p>
<p class="MsoPlainText">> +               ALIGN(le32_to_cpu(hdr->ucode_size_bytes), PAGE_SIZE);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       DRM_INFO("isp fw <%s> load success, (base_addr, size)=(%p,%d)\n", fw_name,<o:p></o:p></p>
<p class="MsoPlainText">> +                adev->isp.fw->data, (int)adev->isp.fw->size);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       return r;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_early_init(void *handle) {<o:p></o:p></p>
<p class="MsoPlainText">> +       int ret = 0;<o:p></o:p></p>
<p class="MsoPlainText">> +       struct amdgpu_device *adev = (struct amdgpu_device *)handle;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       ret = isp_load_fw_by_psp(adev);<o:p></o:p></p>
<p class="MsoPlainText">> +       if (ret) {<o:p></o:p></p>
<p class="MsoPlainText">> +               DRM_WARN("%s: isp fw load failed\n", __func__);<o:p></o:p></p>
<p class="MsoPlainText">> +               ret = 0;<o:p></o:p></p>
<p class="MsoPlainText">> +       }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +       return ret;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static bool isp_is_idle(void *handle) {<o:p></o:p></p>
<p class="MsoPlainText">> +       return true;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_wait_for_idle(void *handle) {<o:p></o:p></p>
<p class="MsoPlainText">> +       return 0;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_soft_reset(void *handle) {<o:p></o:p></p>
<p class="MsoPlainText">> +       return 0;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_set_clockgating_state(void *handle,<o:p></o:p></p>
<p class="MsoPlainText">> +                                    enum amd_clockgating_state state)
<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +       return 0;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static int isp_set_powergating_state(void *handle,<o:p></o:p></p>
<p class="MsoPlainText">> +                                    enum amd_powergating_state state)
<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +       return 0;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +static const struct amd_ip_funcs isp_ip_funcs = {<o:p></o:p></p>
<p class="MsoPlainText">> +       .name = "isp_ip",<o:p></o:p></p>
<p class="MsoPlainText">> +       .early_init = isp_early_init,<o:p></o:p></p>
<p class="MsoPlainText">> +       .late_init = NULL,<o:p></o:p></p>
<p class="MsoPlainText">> +       .sw_init = isp_sw_init,<o:p></o:p></p>
<p class="MsoPlainText">> +       .sw_fini = isp_sw_fini,<o:p></o:p></p>
<p class="MsoPlainText">> +       .hw_init = isp_hw_init,<o:p></o:p></p>
<p class="MsoPlainText">> +       .hw_fini = isp_hw_fini,<o:p></o:p></p>
<p class="MsoPlainText">> +       .suspend = isp_suspend,<o:p></o:p></p>
<p class="MsoPlainText">> +       .resume = isp_resume,<o:p></o:p></p>
<p class="MsoPlainText">> +       .is_idle = isp_is_idle,<o:p></o:p></p>
<p class="MsoPlainText">> +       .wait_for_idle = isp_wait_for_idle,<o:p></o:p></p>
<p class="MsoPlainText">> +       .soft_reset = isp_soft_reset,<o:p></o:p></p>
<p class="MsoPlainText">> +       .set_clockgating_state = isp_set_clockgating_state,<o:p></o:p></p>
<p class="MsoPlainText">> +       .set_powergating_state = isp_set_powergating_state, };<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +const struct amdgpu_ip_block_version isp_ip_block = {<o:p></o:p></p>
<p class="MsoPlainText">> +       .type = AMD_IP_BLOCK_TYPE_ISP,<o:p></o:p></p>
<p class="MsoPlainText">> +       .major = 4,<o:p></o:p></p>
<p class="MsoPlainText">> +       .minor = 1,<o:p></o:p></p>
<p class="MsoPlainText">> +       .rev = 0,<o:p></o:p></p>
<p class="MsoPlainText">> +       .funcs = &isp_ip_funcs,<o:p></o:p></p>
<p class="MsoPlainText">> +};<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_isp.h <o:p>
</o:p></p>
<p class="MsoPlainText">> b/drivers/gpu/drm/amd/amdgpu/amdgpu_isp.h<o:p></o:p></p>
<p class="MsoPlainText">> new file mode 100644<o:p></o:p></p>
<p class="MsoPlainText">> index 000000000000..2adcb4b4dc6e<o:p></o:p></p>
<p class="MsoPlainText">> --- /dev/null<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_isp.h<o:p></o:p></p>
<p class="MsoPlainText">> @@ -0,0 +1,54 @@<o:p></o:p></p>
<p class="MsoPlainText">> +/* SPDX-License-Identifier: MIT */<o:p></o:p></p>
<p class="MsoPlainText">> +/*<o:p></o:p></p>
<p class="MsoPlainText">> + * Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<o:p></o:p></p>
<p class="MsoPlainText">> + * All Rights Reserved.<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + * Permission is hereby granted, free of charge, to any person
<o:p></o:p></p>
<p class="MsoPlainText">> +obtaining a<o:p></o:p></p>
<p class="MsoPlainText">> + * copy of this software and associated documentation files (the<o:p></o:p></p>
<p class="MsoPlainText">> + * "Software"), to deal in the Software without restriction,
<o:p></o:p></p>
<p class="MsoPlainText">> +including<o:p></o:p></p>
<p class="MsoPlainText">> + * without limitation the rights to use, copy, modify, merge,
<o:p></o:p></p>
<p class="MsoPlainText">> +publish,<o:p></o:p></p>
<p class="MsoPlainText">> + * distribute, sub license, and/or sell copies of the Software, and
<o:p></o:p></p>
<p class="MsoPlainText">> +to<o:p></o:p></p>
<p class="MsoPlainText">> + * permit persons to whom the Software is furnished to do so, subject
<o:p></o:p></p>
<p class="MsoPlainText">> +to<o:p></o:p></p>
<p class="MsoPlainText">> + * the following conditions:<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
<o:p></o:p></p>
<p class="MsoPlainText">> +EXPRESS OR<o:p></o:p></p>
<p class="MsoPlainText">> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
<o:p></o:p></p>
<p class="MsoPlainText">> +MERCHANTABILITY,<o:p></o:p></p>
<p class="MsoPlainText">> + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT
<o:p></o:p></p>
<p class="MsoPlainText">> +SHALL<o:p></o:p></p>
<p class="MsoPlainText">> + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR
<o:p></o:p></p>
<p class="MsoPlainText">> +ANY CLAIM,<o:p></o:p></p>
<p class="MsoPlainText">> + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
<o:p></o:p></p>
<p class="MsoPlainText">> +OR<o:p></o:p></p>
<p class="MsoPlainText">> + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
<o:p></o:p></p>
<p class="MsoPlainText">> +OR THE<o:p></o:p></p>
<p class="MsoPlainText">> + * USE OR OTHER DEALINGS IN THE SOFTWARE.<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + * The above copyright notice and this permission notice (including
<o:p></o:p></p>
<p class="MsoPlainText">> +the<o:p></o:p></p>
<p class="MsoPlainText">> + * next paragraph) shall be included in all copies or substantial
<o:p></o:p></p>
<p class="MsoPlainText">> +portions<o:p></o:p></p>
<p class="MsoPlainText">> + * of the Software.<o:p></o:p></p>
<p class="MsoPlainText">> + *<o:p></o:p></p>
<p class="MsoPlainText">> + */<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +#ifndef __AMDGPU_ISP_H__<o:p></o:p></p>
<p class="MsoPlainText">> +#define __AMDGPU_ISP_H__<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +#include <linux/mfd/core.h><o:p></o:p></p>
<p class="MsoPlainText">> +#include <linux/mfd/core.h><o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +#define ISP_REGS_OFFSET_END 0x629A4<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +struct isp_platform_data {<o:p></o:p></p>
<p class="MsoPlainText">> +       void *adev;<o:p></o:p></p>
<p class="MsoPlainText">> +       u32 asic_type;<o:p></o:p></p>
<p class="MsoPlainText">> +       resource_size_t base_rmmio_size; };<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +struct amdgpu_isp {<o:p></o:p></p>
<p class="MsoPlainText">> +       struct device *parent;<o:p></o:p></p>
<p class="MsoPlainText">> +       struct cgs_device *cgs_device;<o:p></o:p></p>
<p class="MsoPlainText">> +       struct mfd_cell *isp_cell;<o:p></o:p></p>
<p class="MsoPlainText">> +       struct resource *isp_res;<o:p></o:p></p>
<p class="MsoPlainText">> +       struct isp_platform_data *isp_pdata;<o:p></o:p></p>
<p class="MsoPlainText">> +       unsigned int harvest_config;<o:p></o:p></p>
<p class="MsoPlainText">> +       const struct firmware   *fw;<o:p></o:p></p>
<p class="MsoPlainText">> +};<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +extern const struct amdgpu_ip_block_version isp_ip_block;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +#endif /* __AMDGPU_ISP_H__ */<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c <o:p>
</o:p></p>
<p class="MsoPlainText">> b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c<o:p></o:p></p>
<p class="MsoPlainText">> index 37820dd03cab..b4bd943a7cc8 100644<o:p></o:p></p>
<p class="MsoPlainText">> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c<o:p></o:p></p>
<p class="MsoPlainText">> @@ -2539,6 +2539,9 @@ static int psp_get_fw_type(struct amdgpu_firmware_info *ucode,<o:p></o:p></p>
<p class="MsoPlainText">>         case AMDGPU_UCODE_ID_JPEG_RAM:<o:p></o:p></p>
<p class="MsoPlainText">>                 *type = GFX_FW_TYPE_JPEG_RAM;<o:p></o:p></p>
<p class="MsoPlainText">>                 break;<o:p></o:p></p>
<p class="MsoPlainText">> +       case AMDGPU_UCODE_ID_ISP:<o:p></o:p></p>
<p class="MsoPlainText">> +               *type = GFX_FW_TYPE_ISP;<o:p></o:p></p>
<p class="MsoPlainText">> +               break;<o:p></o:p></p>
<p class="MsoPlainText">>         case AMDGPU_UCODE_ID_MAXIMUM:<o:p></o:p></p>
<p class="MsoPlainText">>         default:<o:p></o:p></p>
<p class="MsoPlainText">>                 return -EINVAL;<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c <o:p>
</o:p></p>
<p class="MsoPlainText">> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c<o:p></o:p></p>
<p class="MsoPlainText">> index 75ece8a2f96b..a9de78bb96e2 100644<o:p></o:p></p>
<p class="MsoPlainText">> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c<o:p></o:p></p>
<p class="MsoPlainText">> @@ -712,6 +712,8 @@ const char *amdgpu_ucode_name(enum AMDGPU_UCODE_ID ucode_id)<o:p></o:p></p>
<p class="MsoPlainText">>                 return "RS64_MEC_P2_STACK";<o:p></o:p></p>
<p class="MsoPlainText">>         case AMDGPU_UCODE_ID_CP_RS64_MEC_P3_STACK:<o:p></o:p></p>
<p class="MsoPlainText">>                 return "RS64_MEC_P3_STACK";<o:p></o:p></p>
<p class="MsoPlainText">> +       case AMDGPU_UCODE_ID_ISP:<o:p></o:p></p>
<p class="MsoPlainText">> +               return "ISP";<o:p></o:p></p>
<p class="MsoPlainText">>         default:<o:p></o:p></p>
<p class="MsoPlainText">>                 return "UNKNOWN UCODE";<o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">> @@ -1411,6 +1413,9 @@ void amdgpu_ucode_ip_version_decode(struct amdgpu_device *adev, int block_type,<o:p></o:p></p>
<p class="MsoPlainText">>         case VPE_HWIP:<o:p></o:p></p>
<p class="MsoPlainText">>                 ip_name = "vpe";<o:p></o:p></p>
<p class="MsoPlainText">>                 break;<o:p></o:p></p>
<p class="MsoPlainText">> +       case ISP_HWIP:<o:p></o:p></p>
<p class="MsoPlainText">> +               ip_name = "isp";<o:p></o:p></p>
<p class="MsoPlainText">> +               break;<o:p></o:p></p>
<p class="MsoPlainText">>         default:<o:p></o:p></p>
<p class="MsoPlainText">>                 BUG();<o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h <o:p>
</o:p></p>
<p class="MsoPlainText">> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h<o:p></o:p></p>
<p class="MsoPlainText">> index a3c04f711099..db745ab7b0c8 100644<o:p></o:p></p>
<p class="MsoPlainText">> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h<o:p></o:p></p>
<p class="MsoPlainText">> @@ -523,6 +523,7 @@ enum AMDGPU_UCODE_ID {<o:p></o:p></p>
<p class="MsoPlainText">>         AMDGPU_UCODE_ID_UMSCH_MM_CMD_BUFFER,<o:p></o:p></p>
<p class="MsoPlainText">>         AMDGPU_UCODE_ID_P2S_TABLE,<o:p></o:p></p>
<p class="MsoPlainText">>         AMDGPU_UCODE_ID_JPEG_RAM,<o:p></o:p></p>
<p class="MsoPlainText">> +       AMDGPU_UCODE_ID_ISP,<o:p></o:p></p>
<p class="MsoPlainText">>         AMDGPU_UCODE_ID_MAXIMUM,<o:p></o:p></p>
<p class="MsoPlainText">>  };<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">> --<o:p></o:p></p>
<p class="MsoPlainText">> 2.34.1<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
</div>
</div>
</body>
</html>