Claude review: accel/amdxdna: Create common SMU interfaces for AIE2 and AIE4

Claude Code Review Bot
2026-03-31T07:05:09Z

Patch Review

Moves SMU code from `aie2_smu.c` to `aie_smu.c` with a new `smu_device` abstraction.

**Issue 1 — Non-angle-bracket include:**
```c
+#include "drm/amdxdna_accel.h"
```
Should be `<drm/amdxdna_accel.h>` (angle brackets for installed headers).

**Issue 2 — Unnecessary include:**
```c
+#include <drm/gpu_scheduler.h>
```
`aie_smu.c` doesn't use any gpu_scheduler APIs. This was carried over from the old `aie2_smu.c`.

**Issue 3 — `aie2_smu_fini` wraps two operations but `aie_smu_fini` only does one:**
```c
// Old:
void aie2_smu_fini(struct amdxdna_dev_hdl *ndev)
{
ndev->priv->hw_ops.set_dpm(ndev, 0); // Reset DPM first
aie2_smu_exec(ndev, AIE2_SMU_POWER_OFF, ...);
}

// New wrapper in aie2_pci.c:
static void aie2_smu_fini(struct amdxdna_dev_hdl *ndev)
{
ndev->priv->hw_ops.set_dpm(ndev, 0);
aie_smu_fini(ndev->aie.smu_hdl);
}
```
The DPM reset is kept in the wrapper. This is fine but means AIE4 callers must remember to reset DPM themselves before calling `aie_smu_fini()` or the power-off happens at whatever DPM level was active. The patch 6 AIE4 path calls `aie_smu_fini()` directly without a DPM reset — need to confirm this is intentional.

**Issue 4 — `npu1_set_dpm` moved to `npu1_regs.c`:**
The `npu1_set_dpm` function was `extern` declared in `aie2_pci.h` but is now a `static` function in `npu1_regs.c`. However, `npu4_set_dpm` remains extern. The header still has:
```c
int npu4_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level);
```
But `npu1_set_dpm` declaration is removed. This works because `npu1_set_dpm` is referenced only via function pointer in `npu1_regs.c`, but the asymmetry is confusing.

---
Generated by Claude Code Patch Reviewer