mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-27 07:51:38 +00:00
armv8: ls1046a: setup fman ports ICIDs and device tree
Add support for ICID setting of fman ports and the required device tree fixups. Reviewed-by: Bharat Bhushan <bharat.bhushan@nxp.com> Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com> Reviewed-by: York Sun <york.sun@nxp.com>
This commit is contained in:
parent
599a97d49c
commit
b50ff5e1b6
3 changed files with 122 additions and 0 deletions
|
@ -10,6 +10,7 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/arch-fsl-layerscape/fsl_icid.h>
|
#include <asm/arch-fsl-layerscape/fsl_icid.h>
|
||||||
|
#include <fsl_fman.h>
|
||||||
|
|
||||||
static void set_icid(struct icid_id_table *tbl, int size)
|
static void set_icid(struct icid_id_table *tbl, int size)
|
||||||
{
|
{
|
||||||
|
@ -19,10 +20,27 @@ static void set_icid(struct icid_id_table *tbl, int size)
|
||||||
out_be32((u32 *)(tbl[i].reg_addr), tbl[i].reg);
|
out_be32((u32 *)(tbl[i].reg_addr), tbl[i].reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYS_DPAA_FMAN
|
||||||
|
void set_fman_icids(struct fman_icid_id_table *tbl, int size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
ccsr_fman_t *fm = (void *)CONFIG_SYS_FSL_FM1_ADDR;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
out_be32(&fm->fm_bmi_common.fmbm_ppid[tbl[i].port_id - 1],
|
||||||
|
tbl[i].icid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void set_icids(void)
|
void set_icids(void)
|
||||||
{
|
{
|
||||||
/* setup general icid offsets */
|
/* setup general icid offsets */
|
||||||
set_icid(icid_tbl, icid_tbl_sz);
|
set_icid(icid_tbl, icid_tbl_sz);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYS_DPAA_FMAN
|
||||||
|
set_fman_icids(fman_icid_tbl, fman_icid_tbl_sz);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids)
|
int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids)
|
||||||
|
@ -75,6 +93,66 @@ int fdt_fixup_icid_tbl(void *blob, int smmu_ph,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYS_DPAA_FMAN
|
||||||
|
int get_fman_port_icid(int port_id, struct fman_icid_id_table *tbl,
|
||||||
|
const int size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
if (tbl[i].port_id == port_id)
|
||||||
|
return tbl[i].icid;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdt_fixup_fman_port_icid_by_compat(void *blob, int smmu_ph,
|
||||||
|
const char *compat)
|
||||||
|
{
|
||||||
|
int noff, len, icid;
|
||||||
|
const u32 *prop;
|
||||||
|
|
||||||
|
noff = fdt_node_offset_by_compatible(blob, -1, compat);
|
||||||
|
while (noff > 0) {
|
||||||
|
prop = fdt_getprop(blob, noff, "cell-index", &len);
|
||||||
|
if (!prop) {
|
||||||
|
printf("WARNING missing cell-index for fman port\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (len != 4) {
|
||||||
|
printf("WARNING bad cell-index size for fman port\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
icid = get_fman_port_icid(fdt32_to_cpu(*prop),
|
||||||
|
fman_icid_tbl, fman_icid_tbl_sz);
|
||||||
|
if (icid < 0) {
|
||||||
|
printf("WARNING unknown ICID for fman port %d\n",
|
||||||
|
*prop);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
fdt_set_iommu_prop(blob, noff, smmu_ph, (u32 *)&icid, 1);
|
||||||
|
|
||||||
|
noff = fdt_node_offset_by_compatible(blob, noff, compat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdt_fixup_fman_icids(void *blob, int smmu_ph)
|
||||||
|
{
|
||||||
|
static const char * const compats[] = {
|
||||||
|
"fsl,fman-v3-port-oh",
|
||||||
|
"fsl,fman-v3-port-rx",
|
||||||
|
"fsl,fman-v3-port-tx",
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(compats); i++)
|
||||||
|
fdt_fixup_fman_port_icid_by_compat(blob, smmu_ph, compats[i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int fdt_get_smmu_phandle(void *blob)
|
int fdt_get_smmu_phandle(void *blob)
|
||||||
{
|
{
|
||||||
int noff, smmu_ph;
|
int noff, smmu_ph;
|
||||||
|
@ -107,4 +185,8 @@ void fdt_fixup_icid(void *blob)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fdt_fixup_icid_tbl(blob, smmu_ph, icid_tbl, icid_tbl_sz);
|
fdt_fixup_icid_tbl(blob, smmu_ph, icid_tbl, icid_tbl_sz);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYS_DPAA_FMAN
|
||||||
|
fdt_fixup_fman_icids(blob, smmu_ph);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,3 +43,33 @@ struct icid_id_table icid_tbl[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
int icid_tbl_sz = ARRAY_SIZE(icid_tbl);
|
int icid_tbl_sz = ARRAY_SIZE(icid_tbl);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYS_DPAA_FMAN
|
||||||
|
struct fman_icid_id_table fman_icid_tbl[] = {
|
||||||
|
/* port id, icid */
|
||||||
|
SET_FMAN_ICID_ENTRY(0x02, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x03, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x04, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x05, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x06, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x07, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x08, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x09, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x0a, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x0b, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x0c, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x0d, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x28, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x29, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x2a, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x2b, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x2c, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x2d, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x10, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x11, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x30, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
SET_FMAN_ICID_ENTRY(0x31, FSL_DPAA1_STREAM_ID_END),
|
||||||
|
};
|
||||||
|
|
||||||
|
int fman_icid_tbl_sz = ARRAY_SIZE(fman_icid_tbl);
|
||||||
|
#endif
|
||||||
|
|
|
@ -17,6 +17,11 @@ struct icid_id_table {
|
||||||
phys_addr_t reg_addr;
|
phys_addr_t reg_addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct fman_icid_id_table {
|
||||||
|
u32 port_id;
|
||||||
|
u32 icid;
|
||||||
|
};
|
||||||
|
|
||||||
u32 get_ppid_icid(int ppid_tbl_idx, int ppid);
|
u32 get_ppid_icid(int ppid_tbl_idx, int ppid);
|
||||||
int fdt_get_smmu_phandle(void *blob);
|
int fdt_get_smmu_phandle(void *blob);
|
||||||
int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids);
|
int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids);
|
||||||
|
@ -74,7 +79,12 @@ void fdt_fixup_icid(void *blob);
|
||||||
CONFIG_SYS_FSL_BMAN_ADDR, \
|
CONFIG_SYS_FSL_BMAN_ADDR, \
|
||||||
CONFIG_SYS_FSL_BMAN_ADDR)
|
CONFIG_SYS_FSL_BMAN_ADDR)
|
||||||
|
|
||||||
|
#define SET_FMAN_ICID_ENTRY(_port_id, streamid) \
|
||||||
|
{ .port_id = (_port_id), .icid = (streamid) }
|
||||||
|
|
||||||
extern struct icid_id_table icid_tbl[];
|
extern struct icid_id_table icid_tbl[];
|
||||||
|
extern struct fman_icid_id_table fman_icid_tbl[];
|
||||||
extern int icid_tbl_sz;
|
extern int icid_tbl_sz;
|
||||||
|
extern int fman_icid_tbl_sz;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue