mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-12 22:33:18 +00:00
Merge branch '2022-10-21-assorted-fixes-and-updates'
- NC-SI handling support and enable on evb-ast2[56]00, gpio driver for ADP5585, improve qfw support, print more sysresets info, gw_ventana and gcc-12 bugfix, improve BCB support, fix a few typos and remove an unused keymile CONFIG symbol.
This commit is contained in:
commit
1e892ef0b5
25 changed files with 383 additions and 34 deletions
|
@ -239,6 +239,7 @@
|
|||
|
||||
reset@1 {
|
||||
compatible = "sandbox,reset";
|
||||
u-boot,dm-pre-proper;
|
||||
};
|
||||
|
||||
rng {
|
||||
|
|
|
@ -1125,10 +1125,12 @@
|
|||
|
||||
reset@0 {
|
||||
compatible = "sandbox,warm-reset";
|
||||
u-boot,dm-pre-proper;
|
||||
};
|
||||
|
||||
reset@1 {
|
||||
compatible = "sandbox,reset";
|
||||
u-boot,dm-pre-proper;
|
||||
};
|
||||
|
||||
resetc: reset-ctl {
|
||||
|
|
|
@ -633,8 +633,7 @@ void setup_board_gpio(int board, struct ventana_board_info *info)
|
|||
ctrl);
|
||||
gpio_requestf(cfg->gpio_param, "dio%d", i);
|
||||
gpio_direction_input(cfg->gpio_param);
|
||||
} else if (hwconfig_subarg_cmp(arg, "mode", "pwm") &&
|
||||
cfg->pwm_padmux) {
|
||||
} else if (hwconfig_subarg_cmp(arg, "mode", "pwm")) {
|
||||
if (!cfg->pwm_param) {
|
||||
printf("DIO%d: Error: pwm config invalid\n",
|
||||
i);
|
||||
|
|
|
@ -1842,6 +1842,14 @@ config CMD_LINK_LOCAL
|
|||
help
|
||||
Acquire a network IP address using the link-local protocol
|
||||
|
||||
config CMD_NCSI
|
||||
bool "ncsi"
|
||||
depends on PHY_NCSI
|
||||
help
|
||||
Manually configure the attached NIC via NC-SI.
|
||||
Normally this happens automatically before other network
|
||||
operations.
|
||||
|
||||
endif
|
||||
|
||||
config CMD_ETHSW
|
||||
|
|
11
cmd/bcb.c
11
cmd/bcb.c
|
@ -14,6 +14,7 @@
|
|||
#include <part.h>
|
||||
#include <malloc.h>
|
||||
#include <memalign.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
enum bcb_cmd {
|
||||
BCB_CMD_LOAD,
|
||||
|
@ -128,6 +129,16 @@ static int __bcb_load(int devnum, const char *partp)
|
|||
goto err_read_fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* always select the USER mmc hwpart in case another
|
||||
* blk operation selected a different hwpart
|
||||
*/
|
||||
ret = blk_dselect_hwpart(desc, 0);
|
||||
if (IS_ERR_VALUE(ret)) {
|
||||
ret = -ENODEV;
|
||||
goto err_read_fail;
|
||||
}
|
||||
|
||||
part = simple_strtoul(partp, &endp, 0);
|
||||
if (*endp == '\0') {
|
||||
ret = part_get_info(desc, part, &info);
|
||||
|
|
22
cmd/net.c
22
cmd/net.c
|
@ -16,6 +16,7 @@
|
|||
#include <net.h>
|
||||
#include <net/udp.h>
|
||||
#include <net/sntp.h>
|
||||
#include <net/ncsi.h>
|
||||
|
||||
static int netboot_common(enum proto_t, struct cmd_tbl *, int, char * const []);
|
||||
|
||||
|
@ -566,3 +567,24 @@ U_BOOT_CMD(
|
|||
"list - list available devices\n"
|
||||
);
|
||||
#endif // CONFIG_DM_ETH
|
||||
|
||||
#if defined(CONFIG_CMD_NCSI)
|
||||
static int do_ncsi(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
if (!phy_interface_is_ncsi() || !ncsi_active()) {
|
||||
printf("Device not configured for NC-SI\n");
|
||||
return CMD_RET_FAILURE;
|
||||
}
|
||||
|
||||
if (net_loop(NCSI) < 0)
|
||||
return CMD_RET_FAILURE;
|
||||
|
||||
return CMD_RET_SUCCESS;
|
||||
}
|
||||
|
||||
U_BOOT_CMD(
|
||||
ncsi, 1, 1, do_ncsi,
|
||||
"Configure attached NIC via NC-SI",
|
||||
""
|
||||
);
|
||||
#endif /* CONFIG_CMD_NCSI */
|
||||
|
|
|
@ -26,8 +26,8 @@ static int qemu_fwcfg_cmd_setup_kernel(void *load_addr, void *initrd_addr)
|
|||
qfw_read_entry(qfw_dev, FW_CFG_KERNEL_SIZE, 4, &kernel_size);
|
||||
|
||||
if (kernel_size == 0) {
|
||||
printf("warning: no kernel available\n");
|
||||
return -1;
|
||||
printf("fatal: no kernel available\n");
|
||||
return CMD_RET_FAILURE;
|
||||
}
|
||||
|
||||
data_addr = load_addr;
|
||||
|
@ -40,6 +40,7 @@ static int qemu_fwcfg_cmd_setup_kernel(void *load_addr, void *initrd_addr)
|
|||
qfw_read_entry(qfw_dev, FW_CFG_KERNEL_DATA,
|
||||
le32_to_cpu(kernel_size), data_addr);
|
||||
data_addr += le32_to_cpu(kernel_size);
|
||||
env_set_hex("filesize", le32_to_cpu(kernel_size));
|
||||
|
||||
data_addr = initrd_addr;
|
||||
qfw_read_entry(qfw_dev, FW_CFG_INITRD_SIZE, 4, &initrd_size);
|
||||
|
@ -49,6 +50,7 @@ static int qemu_fwcfg_cmd_setup_kernel(void *load_addr, void *initrd_addr)
|
|||
qfw_read_entry(qfw_dev, FW_CFG_INITRD_DATA,
|
||||
le32_to_cpu(initrd_size), data_addr);
|
||||
data_addr += le32_to_cpu(initrd_size);
|
||||
env_set_hex("filesize", le32_to_cpu(initrd_size));
|
||||
}
|
||||
|
||||
qfw_read_entry(qfw_dev, FW_CFG_CMDLINE_SIZE, 4, &cmdline_size);
|
||||
|
|
|
@ -146,20 +146,27 @@ static int print_resetinfo(void)
|
|||
{
|
||||
struct udevice *dev;
|
||||
char status[256];
|
||||
bool status_printed = false;
|
||||
int ret;
|
||||
|
||||
ret = uclass_first_device_err(UCLASS_SYSRESET, &dev);
|
||||
if (ret) {
|
||||
debug("%s: No sysreset device found (error: %d)\n",
|
||||
__func__, ret);
|
||||
/* Not all boards have sysreset drivers available during early
|
||||
* boot, so don't fail if one can't be found.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
/* Not all boards have sysreset drivers available during early
|
||||
* boot, so don't fail if one can't be found.
|
||||
*/
|
||||
for (ret = uclass_first_device_check(UCLASS_SYSRESET, &dev); dev;
|
||||
ret = uclass_next_device_check(&dev)) {
|
||||
if (ret) {
|
||||
debug("%s: %s sysreset device (error: %d)\n",
|
||||
__func__, dev->name, ret);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!sysreset_get_status(dev, status, sizeof(status)))
|
||||
printf("%s", status);
|
||||
if (!sysreset_get_status(dev, status, sizeof(status))) {
|
||||
printf("%s%s", status_printed ? " " : "", status);
|
||||
status_printed = true;
|
||||
}
|
||||
}
|
||||
if (status_printed)
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ CONFIG_CMD_DHCP=y
|
|||
CONFIG_BOOTP_BOOTFILESIZE=y
|
||||
CONFIG_CMD_MII=y
|
||||
CONFIG_CMD_PING=y
|
||||
CONFIG_CMD_NCSI=y
|
||||
CONFIG_ENV_OVERWRITE=y
|
||||
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
|
||||
CONFIG_NET_RANDOM_ETHADDR=y
|
||||
|
@ -50,6 +51,7 @@ CONFIG_SPI_FLASH_SST=y
|
|||
CONFIG_SPI_FLASH_WINBOND=y
|
||||
# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
|
||||
CONFIG_PHY_REALTEK=y
|
||||
CONFIG_PHY_NCSI=y
|
||||
CONFIG_FTGMAC100=y
|
||||
CONFIG_PHY=y
|
||||
CONFIG_PINCTRL=y
|
||||
|
|
|
@ -66,6 +66,7 @@ CONFIG_CMD_DHCP=y
|
|||
CONFIG_BOOTP_BOOTFILESIZE=y
|
||||
CONFIG_CMD_MII=y
|
||||
CONFIG_CMD_PING=y
|
||||
CONFIG_CMD_NCSI=y
|
||||
CONFIG_CMD_EXT4=y
|
||||
CONFIG_DOS_PARTITION=y
|
||||
# CONFIG_SPL_DOS_PARTITION is not set
|
||||
|
@ -98,6 +99,7 @@ CONFIG_SPI_FLASH_SST=y
|
|||
CONFIG_SPI_FLASH_WINBOND=y
|
||||
# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
|
||||
CONFIG_PHY_REALTEK=y
|
||||
CONFIG_PHY_NCSI=y
|
||||
CONFIG_DM_MDIO=y
|
||||
CONFIG_FTGMAC100=y
|
||||
CONFIG_ASPEED_MDIO=y
|
||||
|
|
|
@ -611,4 +611,10 @@ config FTGPIO010
|
|||
help
|
||||
Support for GPIOs on Faraday Technology's FTGPIO010 controller.
|
||||
|
||||
config ADP5585_GPIO
|
||||
bool "ADP5585 GPIO driver"
|
||||
depends on DM_GPIO && DM_I2C
|
||||
help
|
||||
Support ADP5585 GPIO expander.
|
||||
|
||||
endif
|
||||
|
|
|
@ -76,3 +76,4 @@ obj-$(CONFIG_ZYNQMP_GPIO_MODEPIN) += zynqmp_gpio_modepin.o
|
|||
obj-$(CONFIG_SLG7XL45106_I2C_GPO) += gpio_slg7xl45106.o
|
||||
obj-$(CONFIG_$(SPL_TPL_)TURRIS_OMNIA_MCU) += turris_omnia_mcu.o
|
||||
obj-$(CONFIG_FTGPIO010) += ftgpio010.o
|
||||
obj-$(CONFIG_ADP5585_GPIO) += adp5585_gpio.o
|
||||
|
|
238
drivers/gpio/adp5585_gpio.c
Normal file
238
drivers/gpio/adp5585_gpio.c
Normal file
|
@ -0,0 +1,238 @@
|
|||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright 2022 NXP
|
||||
*
|
||||
* ADP5585 I/O Expander Controller
|
||||
*
|
||||
* Author: Alice Guo <alice.guo@nxp.com>
|
||||
*/
|
||||
|
||||
#include <asm/gpio.h>
|
||||
#include <dm.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <i2c.h>
|
||||
|
||||
#define ADP5585_ID 0x00
|
||||
#define ADP5585_INT_STATUS 0x01
|
||||
#define ADP5585_STATUS 0x02
|
||||
#define ADP5585_FIFO_1 0x03
|
||||
#define ADP5585_FIFO_2 0x04
|
||||
#define ADP5585_FIFO_3 0x05
|
||||
#define ADP5585_FIFO_4 0x06
|
||||
#define ADP5585_FIFO_5 0x07
|
||||
#define ADP5585_FIFO_6 0x08
|
||||
#define ADP5585_FIFO_7 0x09
|
||||
#define ADP5585_FIFO_8 0x0A
|
||||
#define ADP5585_FIFO_9 0x0B
|
||||
#define ADP5585_FIFO_10 0x0C
|
||||
#define ADP5585_FIFO_11 0x0D
|
||||
#define ADP5585_FIFO_12 0x0E
|
||||
#define ADP5585_FIFO_13 0x0F
|
||||
#define ADP5585_FIFO_14 0x10
|
||||
#define ADP5585_FIFO_15 0x11
|
||||
#define ADP5585_FIFO_16 0x12
|
||||
#define ADP5585_GPI_INT_STAT_A 0x13
|
||||
#define ADP5585_GPI_INT_STAT_B 0x14
|
||||
#define ADP5585_GPI_STATUS_A 0x15
|
||||
#define ADP5585_GPI_STATUS_B 0x16
|
||||
#define ADP5585_RPULL_CONFIG_A 0x17
|
||||
#define ADP5585_RPULL_CONFIG_B 0x18
|
||||
#define ADP5585_RPULL_CONFIG_C 0x19
|
||||
#define ADP5585_RPULL_CONFIG_D 0x1A
|
||||
#define ADP5585_GPI_INT_LEVEL_A 0x1B
|
||||
#define ADP5585_GPI_INT_LEVEL_B 0x1C
|
||||
#define ADP5585_GPI_EVENT_EN_A 0x1D
|
||||
#define ADP5585_GPI_EVENT_EN_B 0x1E
|
||||
#define ADP5585_GPI_INTERRUPT_EN_A 0x1F
|
||||
#define ADP5585_GPI_INTERRUPT_EN_B 0x20
|
||||
#define ADP5585_DEBOUNCE_DIS_A 0x21
|
||||
#define ADP5585_DEBOUNCE_DIS_B 0x22
|
||||
#define ADP5585_GPO_DATA_OUT_A 0x23
|
||||
#define ADP5585_GPO_DATA_OUT_B 0x24
|
||||
#define ADP5585_GPO_OUT_MODE_A 0x25
|
||||
#define ADP5585_GPO_OUT_MODE_B 0x26
|
||||
#define ADP5585_GPIO_DIRECTION_A 0x27
|
||||
#define ADP5585_GPIO_DIRECTION_B 0x28
|
||||
#define ADP5585_RESET1_EVENT_A 0x29
|
||||
#define ADP5585_RESET1_EVENT_B 0x2A
|
||||
#define ADP5585_RESET1_EVENT_C 0x2B
|
||||
#define ADP5585_RESET2_EVENT_A 0x2C
|
||||
#define ADP5585_RESET2_EVENT_B 0x2D
|
||||
#define ADP5585_RESET_CFG 0x2E
|
||||
#define ADP5585_PWM_OFFT_LOW 0x2F
|
||||
#define ADP5585_PWM_OFFT_HIGH 0x30
|
||||
#define ADP5585_PWM_ONT_LOW 0x31
|
||||
#define ADP5585_PWM_ONT_HIGH 0x32
|
||||
#define ADP5585_PWM_CFG 0x33
|
||||
#define ADP5585_LOGIC_CFG 0x34
|
||||
#define ADP5585_LOGIC_FF_CFG 0x35
|
||||
#define ADP5585_LOGIC_INT_EVENT_EN 0x36
|
||||
#define ADP5585_POLL_PTIME_CFG 0x37
|
||||
#define ADP5585_PIN_CONFIG_A 0x38
|
||||
#define ADP5585_PIN_CONFIG_B 0x39
|
||||
#define ADP5585_PIN_CONFIG_D 0x3A
|
||||
#define ADP5585_GENERAL_CFG 0x3B
|
||||
#define ADP5585_INT_EN 0x3C
|
||||
|
||||
#define ADP5585_MAXGPIO 10
|
||||
#define ADP5585_BANK(offs) ((offs) > 4)
|
||||
#define ADP5585_BIT(offs) ((offs) > 4 ? \
|
||||
1u << ((offs) - 5) : 1u << (offs))
|
||||
|
||||
struct adp5585_plat {
|
||||
fdt_addr_t addr;
|
||||
u8 id;
|
||||
u8 dat_out[2];
|
||||
u8 dir[2];
|
||||
};
|
||||
|
||||
static int adp5585_direction_input(struct udevice *dev, unsigned int offset)
|
||||
{
|
||||
int ret;
|
||||
unsigned int bank;
|
||||
struct adp5585_plat *plat = dev_get_plat(dev);
|
||||
|
||||
bank = ADP5585_BANK(offset);
|
||||
|
||||
plat->dir[bank] &= ~ADP5585_BIT(offset);
|
||||
ret = dm_i2c_write(dev, ADP5585_GPIO_DIRECTION_A + bank, &plat->dir[bank], 1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int adp5585_direction_output(struct udevice *dev, unsigned int offset,
|
||||
int value)
|
||||
{
|
||||
int ret;
|
||||
unsigned int bank, bit;
|
||||
struct adp5585_plat *plat = dev_get_plat(dev);
|
||||
|
||||
bank = ADP5585_BANK(offset);
|
||||
bit = ADP5585_BIT(offset);
|
||||
|
||||
plat->dir[bank] |= bit;
|
||||
|
||||
if (value)
|
||||
plat->dat_out[bank] |= bit;
|
||||
else
|
||||
plat->dat_out[bank] &= ~bit;
|
||||
|
||||
ret = dm_i2c_write(dev, ADP5585_GPO_DATA_OUT_A + bank, &plat->dat_out[bank], 1);
|
||||
ret |= dm_i2c_write(dev, ADP5585_GPIO_DIRECTION_A + bank, &plat->dir[bank], 1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int adp5585_get_value(struct udevice *dev, unsigned int offset)
|
||||
{
|
||||
struct adp5585_plat *plat = dev_get_plat(dev);
|
||||
unsigned int bank = ADP5585_BANK(offset);
|
||||
unsigned int bit = ADP5585_BIT(offset);
|
||||
u8 val;
|
||||
|
||||
if (plat->dir[bank] & bit)
|
||||
val = plat->dat_out[bank];
|
||||
else
|
||||
dm_i2c_read(dev, ADP5585_GPI_STATUS_A + bank, &val, 1);
|
||||
|
||||
return !!(val & bit);
|
||||
}
|
||||
|
||||
static int adp5585_set_value(struct udevice *dev, unsigned int offset, int value)
|
||||
{
|
||||
int ret;
|
||||
unsigned int bank, bit;
|
||||
struct adp5585_plat *plat = dev_get_plat(dev);
|
||||
|
||||
bank = ADP5585_BANK(offset);
|
||||
bit = ADP5585_BIT(offset);
|
||||
|
||||
if (value)
|
||||
plat->dat_out[bank] |= bit;
|
||||
else
|
||||
plat->dat_out[bank] &= ~bit;
|
||||
|
||||
ret = dm_i2c_write(dev, ADP5585_GPO_DATA_OUT_A + bank, &plat->dat_out[bank], 1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int adp5585_get_function(struct udevice *dev, unsigned int offset)
|
||||
{
|
||||
unsigned int bank, bit, dir;
|
||||
struct adp5585_plat *plat = dev_get_plat(dev);
|
||||
|
||||
bank = ADP5585_BANK(offset);
|
||||
bit = ADP5585_BIT(offset);
|
||||
dir = plat->dir[bank] & bit;
|
||||
|
||||
if (!dir)
|
||||
return GPIOF_INPUT;
|
||||
else
|
||||
return GPIOF_OUTPUT;
|
||||
}
|
||||
|
||||
static int adp5585_xlate(struct udevice *dev, struct gpio_desc *desc,
|
||||
struct ofnode_phandle_args *args)
|
||||
{
|
||||
desc->offset = args->args[0];
|
||||
desc->flags = args->args[1] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dm_gpio_ops adp5585_ops = {
|
||||
.direction_input = adp5585_direction_input,
|
||||
.direction_output = adp5585_direction_output,
|
||||
.get_value = adp5585_get_value,
|
||||
.set_value = adp5585_set_value,
|
||||
.get_function = adp5585_get_function,
|
||||
.xlate = adp5585_xlate,
|
||||
};
|
||||
|
||||
static int adp5585_probe(struct udevice *dev)
|
||||
{
|
||||
struct adp5585_plat *plat = dev_get_plat(dev);
|
||||
struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
|
||||
int ret;
|
||||
|
||||
if (!plat)
|
||||
return 0;
|
||||
|
||||
plat->addr = dev_read_addr(dev);
|
||||
if (plat->addr == FDT_ADDR_T_NONE)
|
||||
return -EINVAL;
|
||||
|
||||
ret = dm_i2c_read(dev, ADP5585_ID, &plat->id, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
uc_priv->gpio_count = ADP5585_MAXGPIO;
|
||||
uc_priv->bank_name = "adp5585-gpio";
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
ret = dm_i2c_read(dev, ADP5585_GPO_DATA_OUT_A + i, &plat->dat_out[i], 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = dm_i2c_read(dev, ADP5585_GPIO_DIRECTION_A + i, &plat->dir[i], 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct udevice_id adp5585_ids[] = {
|
||||
{ .compatible = "adp5585" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(adp5585) = {
|
||||
.name = "adp5585",
|
||||
.id = UCLASS_GPIO,
|
||||
.of_match = adp5585_ids,
|
||||
.probe = adp5585_probe,
|
||||
.ops = &adp5585_ops,
|
||||
.plat_auto = sizeof(struct adp5585_plat),
|
||||
};
|
|
@ -188,7 +188,7 @@ static int ftgmac100_phy_adjust_link(struct ftgmac100_data *priv)
|
|||
struct phy_device *phydev = priv->phydev;
|
||||
u32 maccr;
|
||||
|
||||
if (!phydev->link) {
|
||||
if (!phydev->link && priv->phy_mode != PHY_INTERFACE_MODE_NCSI) {
|
||||
dev_err(phydev->dev, "No link\n");
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
|
@ -228,7 +228,8 @@ static int ftgmac100_phy_init(struct udevice *dev)
|
|||
if (!phydev)
|
||||
return -ENODEV;
|
||||
|
||||
phydev->supported &= PHY_GBIT_FEATURES;
|
||||
if (priv->phy_mode != PHY_INTERFACE_MODE_NCSI)
|
||||
phydev->supported &= PHY_GBIT_FEATURES;
|
||||
if (priv->max_speed) {
|
||||
ret = phy_set_supported(phydev, priv->max_speed);
|
||||
if (ret)
|
||||
|
@ -308,7 +309,8 @@ static void ftgmac100_stop(struct udevice *dev)
|
|||
|
||||
writel(0, &ftgmac100->maccr);
|
||||
|
||||
phy_shutdown(priv->phydev);
|
||||
if (priv->phy_mode != PHY_INTERFACE_MODE_NCSI)
|
||||
phy_shutdown(priv->phydev);
|
||||
}
|
||||
|
||||
static int ftgmac100_start(struct udevice *dev)
|
||||
|
@ -580,6 +582,9 @@ static int ftgmac100_probe(struct udevice *dev)
|
|||
priv->max_speed = pdata->max_speed;
|
||||
priv->phy_addr = 0;
|
||||
|
||||
if (dev_read_bool(dev, "use-ncsi"))
|
||||
priv->phy_mode = PHY_INTERFACE_MODE_NCSI;
|
||||
|
||||
#ifdef CONFIG_PHY_ADDR
|
||||
priv->phy_addr = CONFIG_PHY_ADDR;
|
||||
#endif
|
||||
|
@ -592,7 +597,8 @@ static int ftgmac100_probe(struct udevice *dev)
|
|||
* If DM MDIO is enabled, the MDIO bus will be initialized later in
|
||||
* dm_eth_phy_connect
|
||||
*/
|
||||
if (!IS_ENABLED(CONFIG_DM_MDIO)) {
|
||||
if (priv->phy_mode != PHY_INTERFACE_MODE_NCSI &&
|
||||
!IS_ENABLED(CONFIG_DM_MDIO)) {
|
||||
ret = ftgmac100_mdio_init(dev);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to initialize mdiobus: %d\n", ret);
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <log.h>
|
||||
#include <malloc.h>
|
||||
#include <phy.h>
|
||||
#include <net.h>
|
||||
#include <net/ncsi.h>
|
||||
#include <net/ncsi-pkt.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
|
|
@ -1026,7 +1026,7 @@ struct phy_device *phy_connect(struct mii_dev *bus, int addr,
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_PHY_NCSI
|
||||
if (!phydev)
|
||||
if (!phydev && interface == PHY_INTERFACE_MODE_NCSI)
|
||||
phydev = phy_device_create(bus, 0, PHY_NCSI_ID, false);
|
||||
#endif
|
||||
|
||||
|
@ -1275,3 +1275,10 @@ int phy_clear_bits_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool phy_interface_is_ncsi(void)
|
||||
{
|
||||
struct eth_pdata *pdata = dev_get_plat(eth_get_dev());
|
||||
|
||||
return pdata->phy_interface == PHY_INTERFACE_MODE_NCSI;
|
||||
}
|
||||
|
|
|
@ -119,7 +119,7 @@ int blkcache_init(void);
|
|||
* @param start - starting block number
|
||||
* @param blkcnt - number of blocks to read
|
||||
* @param blksz - size in bytes of each block
|
||||
* @param buf - buffer to contain cached data
|
||||
* @param buffer - buffer to contain cached data
|
||||
*
|
||||
* Return: - 1 if block returned from cache, 0 otherwise.
|
||||
*/
|
||||
|
@ -136,7 +136,7 @@ int blkcache_read(int iftype, int dev,
|
|||
* @param start - starting block number
|
||||
* @param blkcnt - number of blocks available
|
||||
* @param blksz - size in bytes of each block
|
||||
* @param buf - buffer containing data to cache
|
||||
* @param buffer - buffer containing data to cache
|
||||
*
|
||||
*/
|
||||
void blkcache_fill(int iftype, int dev,
|
||||
|
@ -250,7 +250,7 @@ struct blk_ops {
|
|||
* The MMC standard provides for two boot partitions (numbered 1 and 2),
|
||||
* rpmb (3), and up to 4 addition general-purpose partitions (4-7).
|
||||
*
|
||||
* @desc: Block device to update
|
||||
* @dev: Block device to update
|
||||
* @hwpart: Hardware partition number to select. 0 means the raw
|
||||
* device, 1 is the first partition, 2 is the second, etc.
|
||||
* @return 0 if OK, -ve on error
|
||||
|
@ -642,6 +642,7 @@ int blk_print_part_devnum(enum uclass_id uclass_id, int devnum);
|
|||
*
|
||||
* @uclass_id: Block device type
|
||||
* @devnum: Device number
|
||||
* @start: Start block number to read (0=first)
|
||||
* @blkcnt: Number of blocks to read
|
||||
* @buffer: Address to write data to
|
||||
* Return: number of blocks read, or -ve error number on error
|
||||
|
@ -654,6 +655,7 @@ ulong blk_read_devnum(enum uclass_id uclass_id, int devnum, lbaint_t start,
|
|||
*
|
||||
* @uclass_id: Block device type
|
||||
* @devnum: Device number
|
||||
* @start: Start block number to write (0=first)
|
||||
* @blkcnt: Number of blocks to write
|
||||
* @buffer: Address to read data from
|
||||
* Return: number of blocks written, or -ve error number on error
|
||||
|
|
|
@ -21,11 +21,8 @@
|
|||
* @CONFIG_KM_RESERVED_PRAM: reserved pram for special purpose
|
||||
* @CONFIG_KM_PHRAM: address for /var
|
||||
* @CONFIG_KM_PNVRAM: address for PNVRAM (for the application)
|
||||
* @CONFIG_KM_ROOTFSSIZE: address for rootfilesystem in RAM
|
||||
*/
|
||||
|
||||
/* size of rootfs in RAM */
|
||||
#define CONFIG_KM_ROOTFSSIZE 0x0
|
||||
/* set the default PRAM value to at least PNVRAM + PHRAM when pram env variable
|
||||
* is not valid yet, which is the case for when u-boot copies itself to RAM */
|
||||
#define CONFIG_PRAM ((CONFIG_KM_PNVRAM + CONFIG_KM_PHRAM)>>10)
|
||||
|
|
|
@ -179,11 +179,8 @@
|
|||
* @CONFIG_KM_RESERVED_PRAM: reserved pram for special purpose
|
||||
* @CONFIG_KM_PHRAM: address for /var
|
||||
* @CONFIG_KM_PNVRAM: address for PNVRAM (for the application)
|
||||
* @CONFIG_KM_ROOTFSSIZE: address for rootfilesystem in RAM
|
||||
*/
|
||||
|
||||
/* size of rootfs in RAM */
|
||||
#define CONFIG_KM_ROOTFSSIZE 0x0
|
||||
/* set the default PRAM value to at least PNVRAM + PHRAM when pram env variable
|
||||
* is not valid yet, which is the case for when u-boot copies itself to RAM
|
||||
*/
|
||||
|
|
|
@ -21,6 +21,17 @@
|
|||
EFI_GUID(0x058b7d83, 0x50d5, 0x4c47, 0xa1, 0x95, \
|
||||
0x60, 0xd8, 0x6a, 0xd3, 0x41, 0xc4)
|
||||
|
||||
/* Try files from QEMU's -kernel/-initrd, through the QEMU firmware device. */
|
||||
#define BOOTENV_DEV_QFW(devtypeu, devtypel, instance) \
|
||||
"bootcmd_qfw= " \
|
||||
"if qfw load $kernel_addr_r $ramdisk_addr_r; then " \
|
||||
" booti $kernel_addr_r $ramdisk_addr_r:$filesize $fdtcontroladdr; " \
|
||||
" if test $? -eq 1; then " \
|
||||
" bootz $kernel_addr_r $ramdisk_addr_r:$filesize $fdtcontroladdr; " \
|
||||
" fi ; " \
|
||||
"fi\0"
|
||||
#define BOOTENV_DEV_NAME_QFW(devtypeu, devtypel, instance) "qfw "
|
||||
|
||||
/* For timer, QEMU emulates an ARMv7/ARMv8 architected timer */
|
||||
|
||||
/* Environment options */
|
||||
|
@ -56,6 +67,7 @@
|
|||
#endif
|
||||
|
||||
#define BOOT_TARGET_DEVICES(func) \
|
||||
func(QFW, qfw, na) \
|
||||
BOOT_TARGET_USB(func) \
|
||||
BOOT_TARGET_SCSI(func) \
|
||||
BOOT_TARGET_VIRTIO(func) \
|
||||
|
|
|
@ -560,7 +560,7 @@ extern int net_restart_wrap; /* Tried all network devices */
|
|||
|
||||
enum proto_t {
|
||||
BOOTP, RARP, ARP, TFTPGET, DHCP, PING, DNS, NFS, CDP, NETCONS, SNTP,
|
||||
TFTPSRV, TFTPPUT, LINKLOCAL, FASTBOOT, WOL, UDP
|
||||
TFTPSRV, TFTPPUT, LINKLOCAL, FASTBOOT, WOL, UDP, NCSI
|
||||
};
|
||||
|
||||
extern char net_boot_file_name[1024];/* Boot File name */
|
||||
|
|
|
@ -412,6 +412,8 @@ static inline bool phy_interface_is_sgmii(struct phy_device *phydev)
|
|||
phydev->interface <= PHY_INTERFACE_MODE_QSGMII;
|
||||
}
|
||||
|
||||
bool phy_interface_is_ncsi(void);
|
||||
|
||||
/* PHY UIDs for various PHYs that are referenced in external code */
|
||||
#define PHY_UID_CS4340 0x13e51002
|
||||
#define PHY_UID_CS4223 0x03e57003
|
||||
|
|
27
net/net.c
27
net/net.c
|
@ -93,6 +93,7 @@
|
|||
#include <net.h>
|
||||
#include <net/fastboot.h>
|
||||
#include <net/tftp.h>
|
||||
#include <net/ncsi.h>
|
||||
#if defined(CONFIG_CMD_PCAP)
|
||||
#include <net/pcap.h>
|
||||
#endif
|
||||
|
@ -410,6 +411,16 @@ int net_loop(enum proto_t protocol)
|
|||
net_try_count = 1;
|
||||
debug_cond(DEBUG_INT_STATE, "--- net_loop Entry\n");
|
||||
|
||||
#ifdef CONFIG_PHY_NCSI
|
||||
if (phy_interface_is_ncsi() && protocol != NCSI && !ncsi_active()) {
|
||||
printf("%s: configuring NCSI first\n", __func__);
|
||||
if (net_loop(NCSI) < 0)
|
||||
return ret;
|
||||
eth_init_state_only();
|
||||
goto restart;
|
||||
}
|
||||
#endif
|
||||
|
||||
bootstage_mark_name(BOOTSTAGE_ID_ETH_START, "eth_start");
|
||||
net_init();
|
||||
if (eth_is_on_demand_init()) {
|
||||
|
@ -423,6 +434,7 @@ int net_loop(enum proto_t protocol)
|
|||
} else {
|
||||
eth_init_state_only();
|
||||
}
|
||||
|
||||
restart:
|
||||
#ifdef CONFIG_USB_KEYBOARD
|
||||
net_busy_flag = 0;
|
||||
|
@ -526,6 +538,11 @@ restart:
|
|||
case WOL:
|
||||
wol_start();
|
||||
break;
|
||||
#endif
|
||||
#if defined(CONFIG_PHY_NCSI)
|
||||
case NCSI:
|
||||
ncsi_probe_packages();
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
|
@ -637,7 +654,7 @@ restart:
|
|||
env_set_hex("filesize", net_boot_file_size);
|
||||
env_set_hex("fileaddr", image_load_addr);
|
||||
}
|
||||
if (protocol != NETCONS)
|
||||
if (protocol != NETCONS && protocol != NCSI)
|
||||
eth_halt();
|
||||
else
|
||||
eth_halt_state_only();
|
||||
|
@ -1321,6 +1338,11 @@ void net_process_received_packet(uchar *in_packet, int len)
|
|||
case PROT_WOL:
|
||||
wol_receive(ip, len);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_PHY_NCSI
|
||||
case PROT_NCSI:
|
||||
ncsi_receive(et, ip, len);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -1381,6 +1403,9 @@ common:
|
|||
|
||||
#ifdef CONFIG_CMD_RARP
|
||||
case RARP:
|
||||
#endif
|
||||
#ifdef CONFIG_PHY_NCSI
|
||||
case NCSI:
|
||||
#endif
|
||||
case BOOTP:
|
||||
case CDP:
|
||||
|
|
|
@ -246,7 +246,6 @@ CONFIG_KM_DEF_ENV_FLASH_BOOT
|
|||
CONFIG_KM_DEV_ENV_FLASH_BOOT_UBI
|
||||
CONFIG_KM_ECC_MODE
|
||||
CONFIG_KM_NEW_ENV
|
||||
CONFIG_KM_ROOTFSSIZE
|
||||
CONFIG_KM_UBI_LINUX_MTD
|
||||
CONFIG_KM_UBI_PARTITION_NAME_APP
|
||||
CONFIG_KM_UBI_PARTITION_NAME_BOOT
|
||||
|
|
4
test/run
4
test/run
|
@ -51,9 +51,9 @@ echo "${prompt}"
|
|||
run_test "sandbox_spl" ./test/py/test.py --bd sandbox_spl --build ${para} \
|
||||
-k 'test_ofplatdata or test_handoff or test_spl'
|
||||
|
||||
# Run the sane tests with sandbox_noinst (i.e. without OF_PLATDATA_INST)
|
||||
# Run the same tests with sandbox_noinst (i.e. without OF_PLATDATA_INST)
|
||||
echo "${prompt}"
|
||||
run_test "sandbox_spl" ./test/py/test.py --bd sandbox_noinst --build ${para} \
|
||||
run_test "sandbox_noinst" ./test/py/test.py --bd sandbox_noinst --build ${para} \
|
||||
-k 'test_ofplatdata or test_handoff or test_spl'
|
||||
|
||||
if [ -z "$tools_only" ]; then
|
||||
|
|
Loading…
Reference in a new issue