Changeset View
Standalone View
sys/arm/mv/mv_common.c
Show First 20 Lines • Show All 76 Lines • ▼ Show 20 Lines | |||||
static int win_eth_can_remap(int i); | static int win_eth_can_remap(int i); | ||||
static int decode_win_cpu_valid(void); | static int decode_win_cpu_valid(void); | ||||
static int decode_win_usb_valid(void); | static int decode_win_usb_valid(void); | ||||
static int decode_win_usb3_valid(void); | static int decode_win_usb3_valid(void); | ||||
static int decode_win_eth_valid(void); | static int decode_win_eth_valid(void); | ||||
static int decode_win_pcie_valid(void); | static int decode_win_pcie_valid(void); | ||||
static int decode_win_sata_valid(void); | static int decode_win_sata_valid(void); | ||||
static int decode_win_sdhci_valid(void); | |||||
static int decode_win_idma_valid(void); | static int decode_win_idma_valid(void); | ||||
static int decode_win_xor_valid(void); | static int decode_win_xor_valid(void); | ||||
static void decode_win_cpu_setup(void); | static void decode_win_cpu_setup(void); | ||||
#ifdef SOC_MV_ARMADAXP | #ifdef SOC_MV_ARMADAXP | ||||
static int decode_win_sdram_fixup(void); | static int decode_win_sdram_fixup(void); | ||||
#endif | #endif | ||||
static void decode_win_usb_setup(u_long); | static void decode_win_usb_setup(u_long); | ||||
static void decode_win_usb3_setup(u_long); | static void decode_win_usb3_setup(u_long); | ||||
static void decode_win_eth_setup(u_long); | static void decode_win_eth_setup(u_long); | ||||
static void decode_win_sata_setup(u_long); | static void decode_win_sata_setup(u_long); | ||||
static void decode_win_ahci_setup(u_long); | static void decode_win_ahci_setup(u_long); | ||||
static void decode_win_sdhci_setup(u_long); | |||||
static void decode_win_idma_setup(u_long); | static void decode_win_idma_setup(u_long); | ||||
static void decode_win_xor_setup(u_long); | static void decode_win_xor_setup(u_long); | ||||
static void decode_win_usb_dump(u_long); | static void decode_win_usb_dump(u_long); | ||||
static void decode_win_usb3_dump(u_long); | static void decode_win_usb3_dump(u_long); | ||||
static void decode_win_eth_dump(u_long base); | static void decode_win_eth_dump(u_long base); | ||||
static void decode_win_idma_dump(u_long base); | static void decode_win_idma_dump(u_long base); | ||||
static void decode_win_xor_dump(u_long base); | static void decode_win_xor_dump(u_long base); | ||||
static void decode_win_ahci_dump(u_long base); | static void decode_win_ahci_dump(u_long base); | ||||
static void decode_win_sdhci_dump(u_long); | |||||
static int fdt_get_ranges(const char *, void *, int, int *, int *); | static int fdt_get_ranges(const char *, void *, int, int *, int *); | ||||
#ifdef SOC_MV_ARMADA38X | #ifdef SOC_MV_ARMADA38X | ||||
int gic_decode_fdt(phandle_t iparent, pcell_t *intr, int *interrupt, | int gic_decode_fdt(phandle_t iparent, pcell_t *intr, int *interrupt, | ||||
int *trig, int *pol); | int *trig, int *pol); | ||||
#endif | #endif | ||||
static int win_cpu_from_dt(void); | static int win_cpu_from_dt(void); | ||||
Show All 17 Lines | struct soc_node_spec { | ||||
dump_win_t dump_handler; | dump_win_t dump_handler; | ||||
}; | }; | ||||
static struct soc_node_spec soc_nodes[] = { | static struct soc_node_spec soc_nodes[] = { | ||||
{ "mrvl,ge", &decode_win_eth_setup, &decode_win_eth_dump }, | { "mrvl,ge", &decode_win_eth_setup, &decode_win_eth_dump }, | ||||
{ "mrvl,usb-ehci", &decode_win_usb_setup, &decode_win_usb_dump }, | { "mrvl,usb-ehci", &decode_win_usb_setup, &decode_win_usb_dump }, | ||||
{ "marvell,armada-380-xhci", &decode_win_usb3_setup, &decode_win_usb3_dump }, | { "marvell,armada-380-xhci", &decode_win_usb3_setup, &decode_win_usb3_dump }, | ||||
{ "marvell,armada-380-ahci", &decode_win_ahci_setup, &decode_win_ahci_dump }, | { "marvell,armada-380-ahci", &decode_win_ahci_setup, &decode_win_ahci_dump }, | ||||
{ "marvell,armada-380-sdhci", &decode_win_sdhci_setup, &decode_win_sdhci_dump }, | |||||
{ "mrvl,sata", &decode_win_sata_setup, NULL }, | { "mrvl,sata", &decode_win_sata_setup, NULL }, | ||||
{ "mrvl,xor", &decode_win_xor_setup, &decode_win_xor_dump }, | { "mrvl,xor", &decode_win_xor_setup, &decode_win_xor_dump }, | ||||
{ "mrvl,idma", &decode_win_idma_setup, &decode_win_idma_dump }, | { "mrvl,idma", &decode_win_idma_setup, &decode_win_idma_dump }, | ||||
{ "mrvl,pcie", &decode_win_pcie_setup, NULL }, | { "mrvl,pcie", &decode_win_pcie_setup, NULL }, | ||||
{ NULL, NULL, NULL }, | { NULL, NULL, NULL }, | ||||
}; | }; | ||||
struct fdt_pm_mask_entry { | struct fdt_pm_mask_entry { | ||||
▲ Show 20 Lines • Show All 414 Lines • ▼ Show 20 Lines | |||||
#ifdef SOC_MV_ARMADAXP | #ifdef SOC_MV_ARMADAXP | ||||
if ((err = decode_win_sdram_fixup()) != 0) | if ((err = decode_win_sdram_fixup()) != 0) | ||||
return(err); | return(err); | ||||
#endif | #endif | ||||
if (!decode_win_cpu_valid() || !decode_win_usb_valid() || | if (!decode_win_cpu_valid() || !decode_win_usb_valid() || | ||||
!decode_win_eth_valid() || !decode_win_idma_valid() || | !decode_win_eth_valid() || !decode_win_idma_valid() || | ||||
!decode_win_pcie_valid() || !decode_win_sata_valid() || | !decode_win_pcie_valid() || !decode_win_sata_valid() || | ||||
!decode_win_xor_valid() || !decode_win_usb3_valid()) | !decode_win_xor_valid() || !decode_win_usb3_valid() || | ||||
!decode_win_sdhci_valid()) | |||||
return (EINVAL); | return (EINVAL); | ||||
decode_win_cpu_setup(); | decode_win_cpu_setup(); | ||||
if (MV_DUMP_WIN) | if (MV_DUMP_WIN) | ||||
soc_dump_decode_win(); | soc_dump_decode_win(); | ||||
eth_port = 0; | eth_port = 0; | ||||
usb_port = 0; | usb_port = 0; | ||||
▲ Show 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | |||||
WIN_REG_BASE_IDX_RD(win_sata, cr, MV_WIN_SATA_CTRL); | WIN_REG_BASE_IDX_RD(win_sata, cr, MV_WIN_SATA_CTRL); | ||||
WIN_REG_BASE_IDX_RD(win_sata, br, MV_WIN_SATA_BASE); | WIN_REG_BASE_IDX_RD(win_sata, br, MV_WIN_SATA_BASE); | ||||
WIN_REG_BASE_IDX_WR(win_sata, cr, MV_WIN_SATA_CTRL); | WIN_REG_BASE_IDX_WR(win_sata, cr, MV_WIN_SATA_CTRL); | ||||
WIN_REG_BASE_IDX_WR(win_sata, br, MV_WIN_SATA_BASE); | WIN_REG_BASE_IDX_WR(win_sata, br, MV_WIN_SATA_BASE); | ||||
#if defined(SOC_MV_ARMADA38X) | #if defined(SOC_MV_ARMADA38X) | ||||
WIN_REG_BASE_IDX_RD(win_sata, sz, MV_WIN_SATA_SIZE); | WIN_REG_BASE_IDX_RD(win_sata, sz, MV_WIN_SATA_SIZE); | ||||
WIN_REG_BASE_IDX_WR(win_sata, sz, MV_WIN_SATA_SIZE); | WIN_REG_BASE_IDX_WR(win_sata, sz, MV_WIN_SATA_SIZE); | ||||
WIN_REG_BASE_IDX_RD(win_sdhci, cr, MV_WIN_SDHCI_CTRL); | |||||
WIN_REG_BASE_IDX_RD(win_sdhci, br, MV_WIN_SDHCI_BASE); | |||||
WIN_REG_BASE_IDX_WR(win_sdhci, cr, MV_WIN_SDHCI_CTRL); | |||||
WIN_REG_BASE_IDX_WR(win_sdhci, br, MV_WIN_SDHCI_BASE); | |||||
mw_semihalf.com: Thanks for the update. However, if you move WIN_REG_BASE_IDX_ macros out of #if defined… | |||||
#endif | #endif | ||||
#ifndef SOC_MV_DOVE | #ifndef SOC_MV_DOVE | ||||
WIN_REG_IDX_RD(ddr, br, MV_WIN_DDR_BASE, MV_DDR_CADR_BASE) | WIN_REG_IDX_RD(ddr, br, MV_WIN_DDR_BASE, MV_DDR_CADR_BASE) | ||||
WIN_REG_IDX_RD(ddr, sz, MV_WIN_DDR_SIZE, MV_DDR_CADR_BASE) | WIN_REG_IDX_RD(ddr, sz, MV_WIN_DDR_SIZE, MV_DDR_CADR_BASE) | ||||
WIN_REG_IDX_WR(ddr, br, MV_WIN_DDR_BASE, MV_DDR_CADR_BASE) | WIN_REG_IDX_WR(ddr, br, MV_WIN_DDR_BASE, MV_DDR_CADR_BASE) | ||||
WIN_REG_IDX_WR(ddr, sz, MV_WIN_DDR_SIZE, MV_DDR_CADR_BASE) | WIN_REG_IDX_WR(ddr, sz, MV_WIN_DDR_SIZE, MV_DDR_CADR_BASE) | ||||
#else | #else | ||||
▲ Show 20 Lines • Show All 1,399 Lines • ▼ Show 20 Lines | decode_win_sata_valid(void) | ||||
uint32_t dev, rev; | uint32_t dev, rev; | ||||
soc_id(&dev, &rev); | soc_id(&dev, &rev); | ||||
if (dev == MV_DEV_88F5281) | if (dev == MV_DEV_88F5281) | ||||
return (1); | return (1); | ||||
return (decode_win_can_cover_ddr(MV_WIN_SATA_MAX)); | return (decode_win_can_cover_ddr(MV_WIN_SATA_MAX)); | ||||
} | } | ||||
#ifdef SOC_MV_ARMADA38X | |||||
static int | |||||
decode_win_sdhci_valid(void) | |||||
{ | |||||
mw_semihalf.comUnsubmitted Done Inline ActionsHi, I know e.g. usb3 is done exactly same, but I think the only place we should use the ifdef is here: static int return (decode_win_can_cover_ddr(MV_WIN_SDHCI_MAX)); #endif /* Satisfy platforms not equipped with this controller */ return (1); } The registers definition are not under ifdef, so e.g. kirkwood should compile easily. _setup and _dump functions execution is depending on the compatible string, so it can be safe as well. In further perspective, I think also _valid check should depend on the compatible, so that we don't have to add dummy stuff. What do you think? mw_semihalf.com: Hi,
I know e.g. usb3 is done exactly same, but I think the only place we should use the ifdef… | |||||
loosAuthorUnsubmitted Not Done Inline ActionsFixed in the latest update. Thanks! loos: Fixed in the latest update. Thanks! | |||||
return (decode_win_can_cover_ddr(MV_WIN_SDHCI_MAX)); | |||||
} | |||||
static void | |||||
decode_win_sdhci_setup(u_long base) | |||||
{ | |||||
uint32_t cr, br; | |||||
int i, j; | |||||
for (i = 0; i < MV_WIN_SDHCI_MAX; i++) { | |||||
win_sdhci_cr_write(base, i, 0); | |||||
win_sdhci_br_write(base, i, 0); | |||||
} | |||||
for (i = 0; i < MV_WIN_DDR_MAX; i++) | |||||
if (ddr_is_active(i)) { | |||||
br = ddr_base(i); | |||||
cr = (((ddr_size(i) - 1) & | |||||
(IO_WIN_SIZE_MASK << IO_WIN_SIZE_SHIFT)) | | |||||
(ddr_attr(i) << IO_WIN_ATTR_SHIFT) | | |||||
(ddr_target(i) << IO_WIN_TGT_SHIFT) | | |||||
IO_WIN_ENA_MASK); | |||||
/* Use the first available SDHCI window */ | |||||
for (j = 0; j < MV_WIN_SDHCI_MAX; j++) { | |||||
if (win_sdhci_cr_read(base, j) & IO_WIN_ENA_MASK) | |||||
continue; | |||||
win_sdhci_cr_write(base, j, cr); | |||||
win_sdhci_br_write(base, j, br); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
static void | |||||
decode_win_sdhci_dump(u_long base) | |||||
{ | |||||
Done Inline Actions... you will be able to remove ifdef around decode_win_sdhci_setup/dump and the dummy functions below. We won't break Kirkwood or ArmadaXP compilation, and because the routines won't execute on those platforms, because they require compatible string match. mw_semihalf.com: ... you will be able to remove ifdef around decode_win_sdhci_setup/dump and the dummy functions… | |||||
int i; | |||||
for (i = 0; i < MV_WIN_SDHCI_MAX; i++) | |||||
printf("SDHCI window#%d: c 0x%08x, b 0x%08x\n", i, | |||||
win_sdhci_cr_read(base, i), win_sdhci_br_read(base, i)); | |||||
} | |||||
#else | |||||
/* | |||||
* Provide dummy functions to satisfy the build | |||||
* for SoCs not equipped with SDHCI. | |||||
*/ | |||||
static int | |||||
decode_win_sdhci_valid(void) | |||||
{ | |||||
return (1); | |||||
} | |||||
static void | |||||
decode_win_sdhci_setup(u_long base) | |||||
{ | |||||
} | |||||
static void | |||||
decode_win_sdhci_dump(u_long base) | |||||
{ | |||||
} | |||||
#endif | |||||
/************************************************************************** | /************************************************************************** | ||||
* FDT parsing routines. | * FDT parsing routines. | ||||
**************************************************************************/ | **************************************************************************/ | ||||
static int | static int | ||||
fdt_get_ranges(const char *nodename, void *buf, int size, int *tuples, | fdt_get_ranges(const char *nodename, void *buf, int size, int *tuples, | ||||
int *tuplesize) | int *tuplesize) | ||||
▲ Show 20 Lines • Show All 351 Lines • Show Last 20 Lines |
Thanks for the update. However, if you move WIN_REG_BASE_IDX_ macros out of #if defined(SOC_MV_ARMADA38X)...