dapf: Support reg indexing + add ISP

Also enable power if domain exists.

Signed-off-by: Eileen Yoon <eyn@gmx.com>
This commit is contained in:
Eileen Yoon 2023-08-15 02:16:19 +09:00 committed by Hector Martin
parent e378605d70
commit 6072b8facf
3 changed files with 33 additions and 10 deletions

View file

@ -5,6 +5,7 @@
#include "assert.h" #include "assert.h"
#include "malloc.h" #include "malloc.h"
#include "memory.h" #include "memory.h"
#include "pmgr.h"
#include "string.h" #include "string.h"
#include "utils.h" #include "utils.h"
@ -83,7 +84,7 @@ static int dapf_init_t8110(const char *path, u64 base, int node)
return 0; return 0;
} }
int dapf_init(const char *path) int dapf_init(const char *path, int index)
{ {
int ret; int ret;
int dart_path[8]; int dart_path[8];
@ -93,8 +94,14 @@ int dapf_init(const char *path)
return -1; return -1;
} }
u32 pwr;
if (!adt_getprop(adt, node, "clock-gates", &pwr))
pwr = 0;
if (pwr && (pmgr_adt_power_enable(path) < 0))
return -1;
u64 base; u64 base;
if (adt_get_reg(adt, dart_path, "reg", 1, &base, NULL) < 0) { if (adt_get_reg(adt, dart_path, "reg", index, &base, NULL) < 0) {
printf("dapf: Error getting DAPF %s base address.\n", path); printf("dapf: Error getting DAPF %s base address.\n", path);
return -1; return -1;
} }
@ -110,28 +117,44 @@ int dapf_init(const char *path)
return -1; return -1;
} }
if (pwr)
pmgr_adt_power_disable(path);
if (!ret) if (!ret)
printf("dapf: Initialized %s\n", path); printf("dapf: Initialized %s\n", path);
return ret; return ret;
} }
const char *dapf_paths[] = {"/arm-io/dart-aop", "/arm-io/dart-mtp", "/arm-io/dart-pmp", NULL}; struct entry {
const char *path;
int index;
};
struct entry dapf_entries[] = {
{"/arm-io/dart-aop", 1},
{"/arm-io/dart-mtp", 1},
{"/arm-io/dart-pmp", 1},
{"/arm-io/dart-isp", 5},
{NULL, -1},
};
int dapf_init_all(void) int dapf_init_all(void)
{ {
int ret = 0; int ret = 0;
int count = 0; int count = 0;
for (const char **path = dapf_paths; *path; path++) { struct entry *entry = dapf_entries;
if (adt_path_offset(adt, *path) < 0) while (entry->path != NULL) {
if (adt_path_offset(adt, entry->path) < 0) {
entry++;
continue; continue;
}
if (dapf_init(*path) < 0) { if (dapf_init(entry->path, entry->index) < 0) {
ret = -1; ret = -1;
} }
entry++;
count += 1; count += 1;
} }
return ret ? ret : count; return ret ? ret : count;
} }

View file

@ -4,6 +4,6 @@
#define DAPF_H #define DAPF_H
int dapf_init_all(void); int dapf_init_all(void);
int dapf_init(const char *path); int dapf_init(const char *path, int index);
#endif #endif

View file

@ -586,7 +586,7 @@ int proxy_process(ProxyRequest *request, ProxyReply *reply)
reply->retval = dapf_init_all(); reply->retval = dapf_init_all();
break; break;
case P_DAPF_INIT: case P_DAPF_INIT:
reply->retval = dapf_init((const char *)request->args[0]); reply->retval = dapf_init((const char *)request->args[0], 1);
break; break;
case P_CPUFREQ_INIT: case P_CPUFREQ_INIT: