mirror of
https://git.FreeBSD.org/src.git
synced 2025-02-04 17:15:50 +00:00
Adjust Marvell Discovery (MV78xxx) support to recognize newest chip revisions,
handle Z0 revision (early silicon) explicitly due to its quirks. Obtained from: Marvell, Semihalf
This commit is contained in:
parent
71807e2542
commit
bc26e2e38f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=191140
@ -91,7 +91,8 @@ cpu_extra_feat(void)
|
|||||||
uint32_t ef = 0;
|
uint32_t ef = 0;
|
||||||
|
|
||||||
soc_id(&dev, &rev);
|
soc_id(&dev, &rev);
|
||||||
if (dev == MV_DEV_88F6281 || dev == MV_DEV_MV78100)
|
if (dev == MV_DEV_88F6281 || dev == MV_DEV_MV78100_Z0 ||
|
||||||
|
dev == MV_DEV_MV78100)
|
||||||
__asm __volatile("mrc p15, 1, %0, c15, c1, 0" : "=r" (ef));
|
__asm __volatile("mrc p15, 1, %0, c15, c1, 0" : "=r" (ef));
|
||||||
else if (dev == MV_DEV_88F5182 || dev == MV_DEV_88F5281)
|
else if (dev == MV_DEV_88F5182 || dev == MV_DEV_88F5281)
|
||||||
__asm __volatile("mrc p15, 0, %0, c14, c0, 0" : "=r" (ef));
|
__asm __volatile("mrc p15, 0, %0, c14, c0, 0" : "=r" (ef));
|
||||||
@ -166,6 +167,9 @@ soc_identify(void)
|
|||||||
else if (r == 2)
|
else if (r == 2)
|
||||||
rev = "A0";
|
rev = "A0";
|
||||||
break;
|
break;
|
||||||
|
case MV_DEV_MV78100_Z0:
|
||||||
|
dev = "Marvell MV78100 Z0";
|
||||||
|
break;
|
||||||
case MV_DEV_MV78100:
|
case MV_DEV_MV78100:
|
||||||
dev = "Marvell MV78100";
|
dev = "Marvell MV78100";
|
||||||
break;
|
break;
|
||||||
@ -199,15 +203,16 @@ soc_decode_win(void)
|
|||||||
decode_win_cpu_setup();
|
decode_win_cpu_setup();
|
||||||
decode_win_usb_setup();
|
decode_win_usb_setup();
|
||||||
decode_win_eth_setup(MV_ETH0_BASE);
|
decode_win_eth_setup(MV_ETH0_BASE);
|
||||||
if (dev == MV_DEV_MV78100)
|
if (dev == MV_DEV_MV78100 || dev == MV_DEV_MV78100_Z0)
|
||||||
decode_win_eth_setup(MV_ETH1_BASE);
|
decode_win_eth_setup(MV_ETH1_BASE);
|
||||||
if (dev == MV_DEV_88F6281 || dev == MV_DEV_MV78100)
|
if (dev == MV_DEV_88F6281 || dev == MV_DEV_MV78100 ||
|
||||||
|
dev == MV_DEV_MV78100_Z0)
|
||||||
decode_win_cesa_setup();
|
decode_win_cesa_setup();
|
||||||
|
|
||||||
decode_win_idma_setup();
|
decode_win_idma_setup();
|
||||||
decode_win_xor_setup();
|
decode_win_xor_setup();
|
||||||
|
|
||||||
if (dev == MV_DEV_MV78100) {
|
if (dev == MV_DEV_MV78100 || dev == MV_DEV_MV78100_Z0) {
|
||||||
decode_win_pcie_setup(MV_PCIE00_BASE);
|
decode_win_pcie_setup(MV_PCIE00_BASE);
|
||||||
decode_win_pcie_setup(MV_PCIE01_BASE);
|
decode_win_pcie_setup(MV_PCIE01_BASE);
|
||||||
decode_win_pcie_setup(MV_PCIE02_BASE);
|
decode_win_pcie_setup(MV_PCIE02_BASE);
|
||||||
@ -360,7 +365,8 @@ win_cpu_can_remap(int i)
|
|||||||
if ((dev == MV_DEV_88F5182 && i < 2) ||
|
if ((dev == MV_DEV_88F5182 && i < 2) ||
|
||||||
(dev == MV_DEV_88F5281 && i < 4) ||
|
(dev == MV_DEV_88F5281 && i < 4) ||
|
||||||
(dev == MV_DEV_88F6281 && i < 4) ||
|
(dev == MV_DEV_88F6281 && i < 4) ||
|
||||||
(dev == MV_DEV_MV78100 && i < 8))
|
(dev == MV_DEV_MV78100 && i < 8) ||
|
||||||
|
(dev == MV_DEV_MV78100_Z0 && i < 8))
|
||||||
return (1);
|
return (1);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
@ -590,7 +596,7 @@ usb_max_ports(void)
|
|||||||
uint32_t dev, rev;
|
uint32_t dev, rev;
|
||||||
|
|
||||||
soc_id(&dev, &rev);
|
soc_id(&dev, &rev);
|
||||||
return (dev == MV_DEV_MV78100 ? 3 : 1);
|
return ((dev == MV_DEV_MV78100 || dev == MV_DEV_MV78100_Z0) ? 3 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1109,14 +1115,18 @@ win_xor_can_remap(int i)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline int
|
static int
|
||||||
xor_max_eng(void)
|
xor_max_eng(void)
|
||||||
{
|
{
|
||||||
uint32_t dev, rev;
|
uint32_t dev, rev;
|
||||||
|
|
||||||
soc_id(&dev, &rev);
|
soc_id(&dev, &rev);
|
||||||
return ((dev == MV_DEV_88F6281) ? 2 :
|
if (dev == MV_DEV_88F6281)
|
||||||
(dev == MV_DEV_MV78100) ? 1 : 0);
|
return (2);
|
||||||
|
else if ((dev == MV_DEV_MV78100) || (dev == MV_DEV_MV78100_Z0))
|
||||||
|
return (1);
|
||||||
|
else
|
||||||
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -123,12 +123,13 @@ mv_gpio_attach(device_t dev)
|
|||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
mv_gpio_softc = sc;
|
mv_gpio_softc = sc;
|
||||||
|
|
||||||
/* Get board id and revision */
|
/* Get chip id and revision */
|
||||||
soc_id(&dev_id, &rev_id);
|
soc_id(&dev_id, &rev_id);
|
||||||
|
|
||||||
if (dev_id == MV_DEV_88F5182 ||
|
if (dev_id == MV_DEV_88F5182 ||
|
||||||
dev_id == MV_DEV_88F5281 ||
|
dev_id == MV_DEV_88F5281 ||
|
||||||
dev_id == MV_DEV_MV78100) {
|
dev_id == MV_DEV_MV78100 ||
|
||||||
|
dev_id == MV_DEV_MV78100_Z0 ) {
|
||||||
sc->pin_num = 32;
|
sc->pin_num = 32;
|
||||||
sc->irq_num = 4;
|
sc->irq_num = 4;
|
||||||
sc->use_high = 0;
|
sc->use_high = 0;
|
||||||
@ -139,7 +140,7 @@ mv_gpio_attach(device_t dev)
|
|||||||
sc->use_high = 1;
|
sc->use_high = 1;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
device_printf(dev, "unknown board id=0x%x\n", dev_id);
|
device_printf(dev, "unknown chip id=0x%x\n", dev_id);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,10 +98,11 @@ mv_ic_attach(device_t dev)
|
|||||||
sc->ic_high_regs = 0;
|
sc->ic_high_regs = 0;
|
||||||
sc->ic_error_regs = 0;
|
sc->ic_error_regs = 0;
|
||||||
|
|
||||||
if (dev_id == MV_DEV_88F6281 || dev_id == MV_DEV_MV78100)
|
if (dev_id == MV_DEV_88F6281 || dev_id == MV_DEV_MV78100 ||
|
||||||
|
dev_id == MV_DEV_MV78100_Z0)
|
||||||
sc->ic_high_regs = 1;
|
sc->ic_high_regs = 1;
|
||||||
|
|
||||||
if (dev_id == MV_DEV_MV78100)
|
if (dev_id == MV_DEV_MV78100 || dev_id == MV_DEV_MV78100_Z0)
|
||||||
sc->ic_error_regs = 1;
|
sc->ic_error_regs = 1;
|
||||||
|
|
||||||
error = bus_alloc_resources(dev, mv_ic_spec, sc->ic_res);
|
error = bus_alloc_resources(dev, mv_ic_spec, sc->ic_res);
|
||||||
|
@ -459,8 +459,18 @@ pcib_mbus_probe(device_t self)
|
|||||||
id = "88F6281";
|
id = "88F6281";
|
||||||
break;
|
break;
|
||||||
case 0x6381:
|
case 0x6381:
|
||||||
|
id = "MV78100 Z0";
|
||||||
|
break;
|
||||||
|
case 0x7810:
|
||||||
id = "MV78100";
|
id = "MV78100";
|
||||||
break;
|
break;
|
||||||
|
case 0x7820:
|
||||||
|
/*
|
||||||
|
* According to documentation ID 0x7820 is assigned to MV78200.
|
||||||
|
* However some MV78100 chips also use it.
|
||||||
|
*/
|
||||||
|
id = "MV78100/MV78200";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
device_printf(self, "unknown Marvell PCI bridge: %x\n", val);
|
device_printf(self, "unknown Marvell PCI bridge: %x\n", val);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -471,11 +471,12 @@
|
|||||||
/*
|
/*
|
||||||
* Chip ID
|
* Chip ID
|
||||||
*/
|
*/
|
||||||
#define MV_DEV_88F5181 0x5181
|
#define MV_DEV_88F5181 0x5181
|
||||||
#define MV_DEV_88F5182 0x5182
|
#define MV_DEV_88F5182 0x5182
|
||||||
#define MV_DEV_88F5281 0x5281
|
#define MV_DEV_88F5281 0x5281
|
||||||
#define MV_DEV_88F6281 0x6281
|
#define MV_DEV_88F6281 0x6281
|
||||||
#define MV_DEV_MV78100 0x6381
|
#define MV_DEV_MV78100_Z0 0x6381
|
||||||
|
#define MV_DEV_MV78100 0x7810
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Decode windows definitions and macros
|
* Decode windows definitions and macros
|
||||||
|
@ -239,7 +239,8 @@ mge_ver_params(struct mge_softc *sc)
|
|||||||
uint32_t d, r;
|
uint32_t d, r;
|
||||||
|
|
||||||
soc_id(&d, &r);
|
soc_id(&d, &r);
|
||||||
if (d == MV_DEV_88F6281 || d == MV_DEV_MV78100) {
|
if (d == MV_DEV_88F6281 || d == MV_DEV_MV78100 ||
|
||||||
|
d == MV_DEV_MV78100_Z0) {
|
||||||
sc->mge_ver = 2;
|
sc->mge_ver = 2;
|
||||||
sc->mge_mtu = 0x4e8;
|
sc->mge_mtu = 0x4e8;
|
||||||
sc->mge_tfut_ipg_max = 0xFFFF;
|
sc->mge_tfut_ipg_max = 0xFFFF;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user